【题目描述】
【输入格式】
从文件中读入数据。
第一行有两个整数t, k,其中t代表该测试点总共有多少组测试数据,k的意义见【问题描述】。
接下来t行每行两个整数n, m,其中n, m的意义见【问题描述】。
【输出格式】
输出到文件中。
t行,每行一个整数代表所有的0<=i<=n,0<=j<=min(i,m)中有多少对(i, j)满足C(j,i)是k的倍数。
【样例1输入】
1 2 3 3
【样例1输出】
1
【提示】
在所有可能的情况中,只有C(1,2)是2的倍数。
【样例2输入】
2 5 4 5 6 7
【样例2输出】
0 7
【来源】
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #define maxn 2005 6 using namespace std; 7 long long t,n,m,k,f[maxn][maxn],s[maxn][maxn]; 8 int main(){ 9 scanf("%lld%lld",&t,&k); 10 for(int i=0;i<2000;i++)f[i][i]=1,f[i][0]=1; 11 for(int i=1;i<=2000;i++) 12 for(int j=1;j<i;j++) 13 f[i][j]=(f[i-1][j-1]+f[i-1][j])%k; 14 for(int i=1;i<=2000;i++) 15 for(int j=1;j<=2000;j++){ 16 s[i][j]=s[i][j-1]+s[i-1][j]-s[i-1][j-1]; 17 if(f[i][j]==0&&j<=i) s[i][j]++; 18 } 19 for(int i=1;i<=t;i++){ 20 long long ans=0; 21 scanf("%lld%lld",&n,&m); 22 printf("%lld ",s[n][m]); 23 } 24 return 0; 25 }