题目复制变成乱码0.0 这道题刚开始看上去是很懵很懵的,仔细读题,还是很懵。给的组合数公式基本上没什么用(应该都会算吧。。?) 然后自己手写了一遍C(1,1) 到C(5,5)发现组合数递推式f【i,j】=f【i-1】【j】+f【i-1】【j-1】;
然后我想这题不是水题就秒了嘛?开个long long算一下有几个能被整除,询问用二维前缀和维护,然而并不是这样。。开了long long还是爆了0.0(要是用python算一下会不会爆long long就可以了)。把每个组合数都%k不会影响到整除性。所以可以直接%k,然后就AC了。T1一定要注意细节!细节!还有0xb天就NOIP了~加油~嘘 希望ly的期中考试可以AC呢。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=100005;
long long zuhe[2003][2003];
int xw[2003][2003],sum[2003][2003];
int t,k,n,m;
int main(){
memset(zuhe,0,sizeof(zuhe));
memset(xw,0,sizeof(xw));
memset(sum,0,sizeof(sum));
scanf("%d%d",&t,&k);
for(int i=0;i<=2000;i++){
zuhe[i][1]=i;
zuhe[i][0]=1;
}
for(int i=1;i<=2000;i++)
for(int j=1;j<=i;j++){
zuhe[i][j]=(zuhe[i-1][j]%k)+(zuhe[i-1][j-1]%k);
if(zuhe[i][j]%k==0){
xw[i][j]++;
}
}
for(int i=1;i<=2000;i++)
for(int j=1;j<=2000;j++){
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+xw[i][j];
}
for(int i=1;i<=t;i++){
scanf("%d%d",&n,&m);
if(m>n)m=n;
printf("%d\n",sum[n][m]);
}
return 0;
}