枚举盒子数,递推求n个盒子放k个球,可以不放。
ACcode:
#include<cstdio>
#include<cstring>
typedef long long LL;
const int NS=1010;
const int MOD=1000000007;
int a[NS][NS];
void prepare()
{
for (int i=0;i<NS;i++)
a[i][1]=a[0][i]=1;
for (int i=1;i<NS;i++)
for (int j=2;j<NS;j++)
if (j<=i)
a[i][j]=(a[i-j][j]+a[i][j-1])%MOD;
else a[i][j]=a[i][i];
}
int main()
{
prepare();
int T,n,m,k,sum;
scanf("%d",&T);
while (T--)
{
scanf("%d%d",&n,&k);
m=n/k,sum=0;
for (int i=1;i<=m;i++)
sum=(sum+a[n-i*k][i])%MOD;
printf("%d\n",sum);
}
return 0;
}