#include<stdio.h>
#include<string.h>
const int MOD=1e9+7;
int main()
{
long long int a[1005]={0},i,j,t;
int n,k;
scanf("%d",&t);
a[0]=1;
while(t--)
{
scanf("%d%d",&n,&k);
memset(a,0,sizeof(a));
for(i=1;i<=n;i++)
{
if(i<=k)//对第k个台阶之前的数进行初始化,利用公式fn=f(n-1)+...+f(1),f(n-1)=f(n-2)+...+f(1) 所以f(n)=2*f(n-1)
//依次类推
{
a[i]=1;
for(j=i-1;j>0;j--)//j=2;j<=i;j++
{
a[i]*=2;
}
a[i]=a[i]%MOD;
}
else//对k个台阶之后的数进行递归求值,从n-k项向后推到第n项的方案数
{
for(j=1;j<=k;j++)
{
a[i]+=a[i-j]%MOD;
}
a[i]=a[i]%MOD;
}
}
//for(i=0;i<n;i++)
printf("%lld\n",a[n]);
// printf("\n");
}
}
台阶问题每次输入一个n和一个k,n代表的是台阶数,k代表每次跨的最大台阶
最新推荐文章于 2021-06-14 10:32:20 发布