源码如下 变量有注释
#include<iostream>
#include<cstdio>
using namespace std;
long long n,k,t,m,sum,N,a[2010][2010],f[2010],h[2020][2020];//a[i][j]存放C(i,j)的值,f[i]存放k|C(i,1~j)的和,h[i][j]存放n,m的答案
inline long long read()
{
long long x=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
void xhy(long long p)
{
a[p][1]=p;
if(p%k==0)f[p]++;
h[p][1]=h[p-1][1]+f[p];
for(int i=2;i<=p;i++)
{
a[p][i]=a[p][i-1]*(p+1-i)/i;
if(a[p][i]%k==0)f[p]++;
if(i!=p)h[p][i]=h[p-1][i]+f[p];
if(i==p)h[p][i]=h[p-1][i-1]+f[p];
}
}
int main()
{
t=read(),k=read();
for(;t>0;--t)
{
sum=0;
n=read(),m=read();
if(n>N)
{
for(int i=N+1;i<=n;i++)
{
xhy(i);
f[i]+=f[i-1];
}
N=n;
}
if(m>=n)
{
cout<<h[n][n]<<"\n";
continue;
}
cout<<h[n][m]<<"\n";
}
}