危险的组合 Critical Mass
题面翻译
有一些装有铀和铅的盒子,均有无限多个。要求把n(n≤30)个盒子放成一行,但至少有3个铀放在一起(来触发链式反应),有多少种放法?(n=30时答案也在int范围内)
由 @happyZYM 提供翻译
题目描述
输入格式
输出格式
样例 #1
样例输入 #1
4
5
0
样例输出 #1
3
8
分析
题目让我们求存在连续3个以上U(危险组合)的个数有几个。
我们可以这样:
- 我们把第一个盒子拿掉,剩下的满足条件,第一个盒子就能选铀和铅。
- 我们把第一个盒子拿掉,剩下的不满足条件,第2,3,4就只能放铀,也就是就是pow(2,i-4), 减去满足的条件a[i-4]。
代码
#include <bits/stdc++.h>
using namespace std;
int a[10000];
int n;
int main()
{
while(cin>>n)
{
if(n==0)
{
break;
}
memset(a,0,sizeof(a));//清空
a[3]=1;//初始化
a[4]=3;
for(int i=5;i<=n;i++)
{
int k=i-4;
a[i]=a[i-1]*2+pow(2,k)-a[k];//公式
}
cout<<a[n]<<endl;
}
return 0;
}