Noip2016 组合数问题

来源:互联网 发布:oracle 执行sql脚本 编辑:程序博客网 时间:2024/06/05 18:04

虽然说通过组合数递推公式可以看出来C(i,j)=C(i1,j1)+C(i1,j)
就是杨辉三角公式,但是还是有一个很关键的差别…就是当j=1时这个公式不太管用…比如说C13 表示从三个东西里面选一个,有三种选法,这个就需要提前处理了…
只统计每一列满足要求的数的和,求第n行第m列时只要把第n行的前m列加起来就行了

#include <cstdio>#include <iostream>#include <algorithm>using namespace std;int t,n,m,k,ans,san[2002][2002],f[2002][2002],l[2002],nn[10010],mm[10010],maxn;int main() {    cin >> t >> k;    for(int i=1; i<=t; i++) {        cin >> nn[i] >> mm[i];        maxn = max(nn[i],maxn);    }     for (int i=1;i<=maxn;++i) {        san[i][i]=1;        san[i][1]=i%k;    }    for(int i=2; i<=maxn; i++){        for(int j=2; j <= i-1; j++) {            san[i][j] = (san[i-1][j]%k + san[i-1][j-1]%k)%k;        }    }    for(int i=1; i<=maxn; i++) {        for(int j=1; j<=i; j++) {            if(san[i][j]==0)                            f[i][j] = f[i-1][j] + 1;            else f[i][j] = f[i-1][j];           }    }    for(int o=1; o<=t; o++) {        ans = 0;        for(int i=1; i<=mm[o]; i++) {            ans += f[nn[o]][i];        }        cout << ans << endl;    }    return 0;}
原创粉丝点击