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;
}

浙公网安备 33010602011771号