1.对k取模,组合数到20爆int,30爆ll,判断整除问题可以用取模简化
2.一些累计个数问题且有一维或多维线性累积关系时,考虑用数组递推dp处理
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int nn=2000;
int c[nn+5][nn+5];
int ans[nn+5][nn+5];
int main ()
{
int t,n,m,k;
scanf("%d%d",&t,&k);
int minn,cnt;
c[1][0]=1%k,c[1][1]=1%k;
c[0][0]=1%k;
if(!c[0][0])
ans[0][0]=1;
for(int i=1;i<=nn;++i)
{
c[i][0]=1%k;
c[i][i]=1%k;
if(!c[i][0])
{
ans[i][0]=ans[i-1][0]+1;
}
else ans[i][0]=ans[i-1][0];
for(int j=1;j<i;++j)
{
c[i][j]=(c[i-1][j]+c[i-1][j-1])%k;
ans[i][j]=ans[i-1][j]+ans[i][j-1]-ans[i-1][j-1];
if(!c[i][j])
ans[i][j]++;
}
if(k==1)
{
ans[i][i]=ans[i][i-1]+1;
}
else ans[i][i]=ans[i][i-1];
}
// for(int i=0;i<=3;++i)
// {
// for(int j=0;j<=i;++j)
// {
// cout<<ans[i][j]<<" ";
// }
// cout<<"\n";
// }
// cout<<c[3][2]<<endl;
while(t--)
{
cnt=0;
scanf("%d%d",&n,&m);
if(m<=n)
printf("%d\n",ans[n][m]);
else printf("%d\n",ans[n][n]);
}
return 0;
}
cmd/