1、DP。。。不多說,注意就是要排除最後為m個1且m個1前有一個0的狀況。(如果不是在最後放上1導緻有m個1的話,早在dp(i-1)就不合法了)。
#include<cstdio>
#include<cstring>
using namespace std;
int d[50],m,f[50];
int dp(int n){
int &ans=d[n];
if(n==0) ans=1;
if(ans>=0) return ans;
if(n<m) return f[n];
else if(n==m) return f[n]-1;
else ans=dp(n-1)*2-dp(n-m-1);
return ans;
}
int main(){
int L,n;
scanf("%d",&L);
f[1]=2;
for(int i=2;i<=30;i++){
f[i]=f[i-1]*2;
}
for(int i=0;i<L;i++){
scanf("%d%d",&n,&m);
memset(d,-1,sizeof(d));
printf("%d\n",dp(n));
}
return 0;
}