[NOIp2016提高组]组合数问题

Posted skylee的OI博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[NOIp2016提高组]组合数问题相关的知识,希望对你有一定的参考价值。

题目大意:
  给定n,m和k,对于所有的0<=i<=n,0<=j<=min(i,m)有多少对(i,j)满足C(j,i)是k的倍数。

思路:
  先预处理出组合数,再预处理一下能整除个数的前缀和,最后直接答即可。

 1 #include<cstdio>
 2 #include<cctype>
 3 inline int getint() {
 4     register char ch;
 5     while(!isdigit(ch=getchar()));
 6     register int x=ch^0;
 7     while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^0);
 8     return x;
 9 }
10 const int N=2001;
11 int c[N][N],s[N][N];
12 int main() {
13     int T=getint(),k=getint();
14     for(register int i=0;i<N;i++) {
15         c[i][0]=1;
16         for(register int j=1;j<=i;j++) {
17             c[i][j]=(c[i-1][j-1]+c[i-1][j])%k;
18         }
19     }
20     for(register int i=1;i<N;i++) {
21         for(register int j=1;j<N;j++) {
22             s[i][j]=s[i][j-1]+s[i-1][j]-s[i-1][j-1];
23             if(!c[i][j]&&j<=i) s[i][j]++;
24         }
25     }
26     while(T--) {
27         const int n=getint(),m=getint();
28         printf("%d\n",s[n][m]);
29     }
30     return 0;
31 }

 

以上是关于[NOIp2016提高组]组合数问题的主要内容,如果未能解决你的问题,请参考以下文章

[NOIp2016提高组]组合数问题

NOIP2016提高组 Day2 T1 组合数问题

NOIP 2016 day2

noip 2016 提高组试题看法

P2822 组合数问题

NOIP2016组合数问题