Luogu 2822(组合数学)(NOIP2016)

来源:互联网 发布:西北师范大学知行诱骗 编辑:程序博客网 时间:2024/06/03 18:30

传送门
NOIP 2016 D2T1(组合数)
先预处理组合数:
C(i,j)=C(i-1,j)+C(i-1,j-1)
再dp预处理二维每一行的前缀和,最后每组数据统计答案(O(n))即可

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int MAXN=2006;int k,n,m,c[MAXN][MAXN],dp[MAXN][MAXN];int main() {    memset(dp,0,sizeof(dp));    int kase;    scanf("%d%d",&kase,&k);    for (int i=1;i<=2000;++i) {        c[i][1]=i%k;        for (int j=2;j<=i;++j)            c[i][j]=(c[i-1][j]%k+c[i-1][j-1]%k)%k;    }    for (int i=1;i<=2000;++i)        for (int j=1;j<=i;++j)            dp[i][j]=dp[i][j-1]+(c[i][j]==0);    while (kase--) {        scanf("%d%d",&n,&m);        int ans=0;        for (int i=1;i<=n;++i)            ans+=i>m?dp[i][m]:dp[i][i];        printf("%d\n",ans);    }    return 0;}
原创粉丝点击