NOIP2016组合数问题

组合数问题

【题目分析】
dp不解释。首先要来一个组合数将Cnm的值都预处理出来,不过在加起来的时候记得取模。
接下来就是二维前缀和的事情了。

【代码】

#define M 2000
#include
#include
#include
#include
using namespace std;
int c[M+3][M+3],sum[M+3][M+3];
int k,Cas,n,m;
void Rd(int &res){
    char c;
    res=0;
    while(c=getchar(),!isdigit(c));
    do{
        res=(res<<3)+(res<<1)+(c^48);
    }while(c=getchar(),isdigit(c));
}
void Ps(int x){
    if(!x)return;
    Ps(x/10);
    putchar(x%10^48);
}
void Pf(int x){
    if(!x)putchar('0');
    if(x<0)putchar('-'),x=-x;
    Ps(x);
    putchar('\n');
}
void Init(){
    for(int i=0;i<=M;i++)c[i][0]=1;
    for(int i=1;i<=M;i++){
        for(int j=1;j1][j]+c[i-1][j-1];
            c[i][j]%=k;
        }
    }
    for(int i=0;ifor(int j=0;j1][j+1]=sum[i+1][j]+sum[i][j+1]-sum[i][j];
            if(j<=i&&!c[i][j])sum[i+1][j+1]++;
        }
    }
}
int main(){
    Rd(Cas),Rd(k);
    Init();
    while(Cas--){
        Rd(n),Rd(m);
        if(m>n)m=n;
        Pf(sum[n+1][m+1]);
    }return 0;
}

可惜因为自己比较恐惧数学类型的dp,十分不自信,加之第一天爆炸的心理问题,导致dp的转移没有想太多,写了很奇怪的转移方程,样例过了就假装A掉。太不应该了。
当初WA掉这一题,我才知道自己有多年轻。现在看见这种题目就应该要直接切掉,调试都应该是一个耻辱。

你可能感兴趣的:(NOIP复赛,dp,dp)