[NOIP2016] 组合数问题

大水题。竟然还WA了几次。。。

打个杨辉三角的表,然后求一个ans 的前缀和就行了。
需要注意的是如果b>a了,b>a的部分就没有意义了。就直接把b赋值成a就行了。
就这个WA了两次、。。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
int T,K,C[2005][2005],ans[2005][2005];
int main() {
    scanf("%d%d",&T,&K);
    for(int i=0;i<=2000;i++) C[i][0]=1;
    C[1][1]=1;
    for(int i=2;i<=2000;i++) {
        for(int j=1;j<=i;j++) {
            C[i][j]=(C[i-1][j]+C[i-1][j-1])%K;
            ans[i][j]=ans[i-1][j]+ans[i][j-1]-ans[i-1][j-1]+(C[i][j]==0);	
        }
        ans[i][i+1]=ans[i][i];
    }
    int a,b;
    while(T--) {
        scanf("%d%d",&a,&b);
        if(b>a) b=a;
        printf("%d\n",ans[a][b]);
    }
} 
posted @ 2018-09-06 18:52  SWHsz  阅读(94)  评论(0编辑  收藏  举报