您的位置:首页 > 其它

[1st. Aug. 16] NOIP 2011 计算系数——纠结了很久才发现原来第一次做就大体做对了

2016-08-01 20:56 357 查看
我实际上并不懂杨辉三角,是搜了一下定义才知道的。总之我搜到了定义之后,先花了一会,用一维数组把杨辉三角打了出来。但那时我还没有完全参透这个题目,只是准备打出那一半的a=1, b=1 的数据,然后雏形是这样的:用一维数组tri 储存杨辉三角,tri[0] = 0, tri[1] =1, 并 用 for 循环将第K 行的三角打出来。然后输出tri[m] . 这就是我的第一份代码。两分。

然后我又想了一下,决定尝试做另一半数据,总体不变,我又加上了几条语句。

while(n--)ans=(ans*a)%10007;
while(m--)ans=(ans*b)%10007;
加上这两句后就是我的第二份代码了。三分。然后我表情凝重了。
于是我就面对下面这一堆东西发了一会的呆。

#include<iostream>
using namespace std;
int tri[12345]={0,1};
int main(){
<span style="white-space:pre"> </span>int a,b,k,n,m,mark=0;
cin>>a>>b>>k>>n>>m;
for(int i=0;i<=k;i++){
mark++;
for(int j=mark;j>=1;j--)
tri[j]=(tri[j]+tri[j-1])%10007;
}
int ans=tri[m];
while(n--)ans=(ans*a)%10007;
while(m--)ans=(ans*b)%10007;
cout<<ans<<endl;
return 0;
} 直至我发现最本质的错误是,我把杨辉三角对应行中应该输出的数字搞错了,不是m 而应该是 k -m +1,也即是n +1。改了之后为八分。但是这一次我没有慌张,我又盯着题目说明发呆了一会,又发现一个眼瞎导致的错误……下面是终极代码。
#include<iostream>
using namespace std;
long long tri[12345]={0,1};
int main(){
long long a,b,k,n,m,mark=0;
cin>>a>>b>>k>>n>>m;
for(int i=0;i<=k;i++){
mark++;
for(int j=mark;j>=1;j--)
tri[j]=(tri[j]+tri[j-1])%10007;
}
long long ans=tri[n+1];
while(n--)ans=(ans*a)%10007;
while(m--)ans=(ans*b)%10007;
cout<<ans<<endl;
return 0;
} 是的,数据类型定小了。另外,虽然mark 这个变量是多余的,而且删掉以后能节省三行代码的空间,但我已经精疲力尽了。以上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  NOIP 2011