22.8.9

22.8.9

CF1716F

题意: \(n\) 个包 (互不相同), 每个包里有 \(m\) 个球, 编号为 1 ~ m, 现在需要从每个包中拿一个球, 共拿 \(n\) 个球, 记其中编号为奇数的球的个数为 \(F\), 要计算 \(\sum_{i=0}^{n}F^k\)

思路: 记 \(x=\lceil \frac{m}{2}\rceil\) 为每个包中奇数编号球的个数, 那么此时任务即为计算

\[\sum_{i=0}^{n}i^k\dbinom{n}{i}x^i(n-x)^{n-i} \]

此时考虑到 \(i^k\) 可以用第二类斯特林数进行转化

\[i^k=\sum_{j=0}^{i}{k\brace j}*j!*\dbinom{i}{j} \]

分析其组合意义, \(i^k\) 的含义是将 \(k\) 个不同的物品放入 \(i\) 个不同的盒子中, 允许有空盒子方案数

那么选择枚举 \(i\) 中有 \(j\) 个盒子是空的, 且盒子是互相区分的, 即在第二类斯特林数的基础上乘以一个排列和组合即可

那么此时任务变成了

\[\sum_{i=0}^{n}\sum_{j=0}^{i}{k\brace j}*j!*\dbinom{i}{j}\dbinom{n}{i}x^i(n-x)^{n-i}\\ \]

\[=\sum_{i=0}^{n}\sum_{j=0}^{i}{k\brace j}*j!*\dbinom{n}{j}\dbinom{n-j}{i-j}x^i(n-x)^{n-i}\\ \]

\[=\sum_{j=0}^{k}{k\brace j}*j!*\dbinom{n}{j}\sum_{i=j}^{n}\dbinom{n-j}{i-j}x^i(n-x)^{n-i}\\ \]

\[=\sum_{j=0}^{k}{k\brace j}*j!*\dbinom{n}{j}x^jn^{n-j} \]

消掉有关 \(i\) 的项, 运用二项式定理即可

此时对于每一个问题, 在 \(O(k^2)\) 的预处理之后, 可以 \(O(klogn)\) 时间内回答, 可以通过此题

void solve() {
    int n,m,k;
    cin>>n>>m>>k;
    int ans=0;
    int fac=1,C=1;
    int x=(m+1)/2;
    for(int i=0,sz=min(n,k);i<=sz;i++) {
        (ans+=f[k][i]*fac%mod*C%mod*ksm(m,n-i)%mod*ksm(x,i)%mod)%=mod;
        (fac*=(i+1))%=mod;
        (C*=(n-i)*inv[i+1]%mod)%=mod;
    }
    cout<<ans<<endl;
}
posted @ 2022-08-10 14:43  ZI_MA  阅读(37)  评论(0)    收藏  举报