「CF1716F」Bags with Balls

CF1716F

感觉其他做法麻烦了。

\[\sum_{S} f(S)^k = \sum_{S} \sum_{i=1}^{k} \left\{ {k \atop i} \right\} i! \binom{f(S)}{i} = \sum_{i=1}^{k} \left\{ {k \atop i} \right\} i! \sum_{S} \binom{f(S)}{i}. \]

考虑第二层求和的组合意义:

选取一个选球方案,再从其中标号为奇数的球中取出 \(i\) 个。

也就等价于先钦定选 \(i\) 个标号为奇数的球,剩下的随便选的方案数。

\[\sum_{S} \binom{f(S)}{i} = \binom{n}{i} \left\lceil \frac{m}{2} \right\rceil^i m^{n-i}. \]

带入计算即可,时间复杂度 \(\mathcal O(k^2+Tk)\)

#include<bits/stdc++.h>
#define FASTIO ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define rep(i,l,r) for(int i=(l); i<=(r); ++i)
#define drep(i,r,l) for(int i=(r); i>=(l); --i)
using namespace std;
const int N=2005,P=998244353;
int _,n,m,K,S[N][N];
inline int F(int a,int p=P-2,int r=1) {
	for(; p; p>>=1,a=1LL*a*a%P) if(p&1) r=1LL*r*a%P;
	return r;
}
inline void sol() {
    cin>>n>>m>>K;
    int cur=n,tmp=0;
    rep(i,1,min(n,K)) tmp=(tmp+1LL*cur*F(m+1>>1,i)%P*F(m,n-i)%P*S[K][i])%P,cur=1LL*cur*(n-i)%P;
	cout<<tmp<<'\n';
}
inline void init(int n) {
	S[0][0]=1;
    rep(i,1,n) rep(j,1,i) S[i][j]=(1LL*S[i-1][j]*j+S[i-1][j-1])%P;
}
signed main() {
	FASTIO;
    cin>>_,init(N-5);
    while(_--) sol();
}
posted @ 2026-04-07 21:51  in-bustle  阅读(24)  评论(0)    收藏  举报