zoukankan      html  css  js  c++  java
  • 富翁 [组合计数]

    富翁


    color{red}{正解部分}

    先把 100,50100, 50 变成 2,12, 1, 不会影响答案 .

    枚举最后持有 奇数 的人有 ii 个, 总钱数为 3M3M,
    把所有 奇数 减去 11, 总钱数变为 3Mi3M - i, 而剩下的人的财产均为 偶数,
    n1=3Mi2n_1 = frac{3M-i}{2}, 把 n1n_1 分给 nn 个人的方案数量(允许有人没钱) 即为对答案的贡献,
    (ni)(n1+n1n1)egin{pmatrix} n \ iend{pmatrix}egin{pmatrix} n_1+n-1 \ n-1 end{pmatrix},

    但是钱数最多的人最多持有 2M2M 的钱, 还需减去不合法的方案,

    先减去 大于等于 2M2M 的方案数, 先固定一个人至少拥有 2M2M 的钱, 设 n2=Mi2n_2 = frac{M-i}{2},
    方案数为: n(ni)(n2+n1n1)n egin{pmatrix}n \ iend{pmatrix} egin{pmatrix} n_2+n-1 \ n-1 end{pmatrix} .

    还要加上存在 等于 2M2M 的方案数, (ni)(ni)(n2+n2n2)(n-i) egin{pmatrix}n \ iend{pmatrix}egin{pmatrix} n_2+n-2 \ n-2 end{pmatrix} .

    (ni)(n1+n1n1)n(ni)(n2+n1n1)+(ni)(ni)(n2+n2n2) herefore 总方案数为egin{pmatrix} n \ iend{pmatrix}egin{pmatrix} n_1+n-1 \ n-1 end{pmatrix} - n egin{pmatrix}n \ iend{pmatrix} egin{pmatrix} n_2+n-1 \ n-1 end{pmatrix} + (n-i) egin{pmatrix}n \ iend{pmatrix}egin{pmatrix} n_2+n-2 \ n-2 end{pmatrix}


    color{red}{实现部分}

    • MM奇数 时, 才可能出现仅有 11奇数 的情况 .
    • 固定一个人拥有 2M2M 时, iN1i le N-1 .
    #include<bits/stdc++.h>
    #define reg register
    
    const int maxn = 3e7 + 5;
    const int mod = 998244353;
    
    
    int N;
    int M;
    int Ans;
    int fac[maxn];
    int inv[maxn];
    int ifac[maxn];
    
    int C(int n, int m){ if(n < m) return 0; return 1ll*fac[n]*ifac[m]%mod*ifac[n-m]%mod; }
    
    int main(){
            fac[0] = 1; for(reg int i = 1; i < maxn; i ++) fac[i] = 1ll*fac[i-1]*i % mod;
            inv[1] = 1; for(reg int i = 2; i < maxn; i ++) inv[i] = ((-1ll*mod/i*inv[mod%i])%mod + mod)%mod;
            ifac[0] = 1; for(reg int i = 1; i < maxn; i ++) ifac[i] = 1ll*ifac[i-1]*inv[i] % mod;
            scanf("%d%d", &N, &M); int lim = std::min(N, M);
            for(reg int i = (M&1); i <= lim; i += 2){
                    int n1 = (M*3-i)/2, n2 = (M-i)/2;
                    Ans = (Ans + 1ll*C(N, i)*C(n1+N-1, N-1)%mod) % mod;
                    Ans = ((Ans - 1ll*N*C(N, i)%mod*C(n2+N-1, N-1)%mod) + mod) % mod;
                    Ans = (Ans + 1ll*(N-i)*C(N, i)%mod*C(n2+N-2, N-2)%mod) % mod; //
            }
            printf("%d
    ", Ans);
            return 0;
    }
    
  • 相关阅读:
    JavaScript 检测对象类型
    memorize
    高阶函数
    JavaScript 中的不完全函数
    VS C# Winform 重写进度条
    使用ECLIPSE+RED搭建RF自动化测试框架
    NOIP2018濒死记
    HDU 5977 Garden of Eden (树形dp+快速沃尔什变换FWT)
    打FFT时中发现的卡常技巧
    Dynamic Rankings || 动态/静态区间第k小(主席树)
  • 原文地址:https://www.cnblogs.com/zbr162/p/11822434.html
Copyright © 2011-2022 走看看