[NOIp2016] 组合数问题

洛谷 P2822 传送门

这么水的题我居然还调了好几次......

对于所有询问,k都是一样的。

所以先用杨辉三角求出2000以内所有组合数mod k的值c[i][j]。

如果c[i][j]%k==0,那么c[i][j]对答案的贡献f[i][j]就是1。

最后对f[i][j]求个前缀和就好了。

 1 #include<cstdio>
 2 
 3 int t,k,n,m;
 4 int c[2005][2005];
 5 int f[2005][2005];
 6 
 7 int main()
 8 {
 9     scanf("%d%d",&t,&k);
10     c[0][0]=1%k;
11     for(int i=1;i<=2000;i++)
12     {
13         c[i][0]=1%k;
14         for(int j=1;j<=i;j++)
15         {
16             c[i][j]=(c[i-1][j]+c[i-1][j-1])%k;
17         }
18     }
19     for(int i=0;i<=2000;i++)
20     {
21         for(int j=0;j<=i;j++)
22         {
23             if(!c[i][j])f[i][j]=1;
24         }
25     }
26     for(int i=1;i<=2000;i++)
27     {
28         f[i][0]+=f[i-1][0];
29         for(int j=1;j<=2000;j++)
30         {
31             f[i][j]+=f[i-1][j]+f[i][j-1]-f[i-1][j-1];
32         }
33     }
34     for(int i=1;i<=t;i++)
35     {
36         scanf("%d%d",&n,&m);
37         if(m>n)m=n;
38         printf("%d
",f[n][m]);
39     }
40     return 0;
41 }
原文地址:https://www.cnblogs.com/eternhope/p/9734168.html