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

我实际上并不懂杨辉三角,是搜了一下定义才知道的。总之我搜到了定义之后,先花了一会,用一维数组把杨辉三角打了出来。但那时我还没有完全参透这个题目,只是准备打出那一半的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 这个变量是多余的,而且删掉以后能节省三行代码的空间,但我已经精疲力尽了。以上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值