zoukankan      html  css  js  c++  java
  • [题解](组合数/二位前缀和)luogu_P2822组合数问题

    首先要知道C(n,m)=C(n-1,m)+C(n-1,m-1),这样显然是一个杨辉三角,这样大部分的问题就解决了,

    那么判能否整除只需要杨辉三角对k取模即可,

    而对于多组数据的k都是一样的,所以用前缀和优化:上+左-左上+自己

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=2009;
    int n,m,k;
    int f[maxn][maxn];
    int sum[maxn][maxn];
    int main(){int T;
        scanf("%d%d",&T,&k);
        f[0][0]=1;
        f[1][0]=f[1][1]=1;
        for(int i=1;i<=2001;i++)f[i][0]=1;
        for(int i=1;i<=2001;i++){
            for(int j=1;j<=i;j++){
                f[i][j]=(f[i-1][j]+f[i-1][j-1])%k;
                sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
                if(f[i][j]==0)sum[i][j]++;
            }
            sum[i][i+1]=sum[i][i];
        }
        
        for(int pp=1;pp<=T;pp++){
            scanf("%d%d",&n,&m);
            m=min(m,n);
            printf("%d
    ",sum[n][m]);
        }
    }
  • 相关阅读:
    大数据面经
    mysql复习(2)
    java容器
    内存管理
    垃圾收集
    输入/输出流
    排序算法的稳定性及其汇总
    java传值与传引用
    linux复习6
    linux复习5
  • 原文地址:https://www.cnblogs.com/superminivan/p/10840515.html
Copyright © 2011-2022 走看看