#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cctype>
#include <cmath>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <vector>
using namespace std;
long long a[60],co=0;
long long func(long long n,long long m,long long i)
{
long long j;
if(i>n)
{
int p=0,k=0;
for(j=1;j<=n;j++)
{
if(a[j])
{
p++;
}
else
p=0;
if(p>=m)
{
k=1;break;
}
}
if(k) co++;
return 0;
}
a[i]=1;
func(n,m,i+1);
a[i]=0;
func(n,m,i+1);
return 0;
}
int main()
{
long long m,n,k,i;
scanf("%lld %lld",&n,&m);
memset(a,0,sizeof(a));
func(n,m,1);
if(m<=1)
co=(long long)pow(2,n);
printf("%lld\n",(long long)pow(2,n)-co);
return 0;
}
题目
一、一个核电站有N个放核物质的坑,坑排列在一条直线上。如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质。
任务:对于给定的N和M,求不发生爆炸的放置核物质的方案总数。
输入描述 Input Description
输入文件只一行,两个正整数N,M( 1<N<50,2≤M≤5)
输出描述 Output Description
输出文件只有一个正整数S,表示方案总数。
样例输入 Sample Input
4 3
样例输出 Sample Output
13
数据范围及提示
( 1<N<50,2≤M≤5)