CF1716 F-Bags With Balls
Statement
- 有 n n n个互不相同的盒子, 里面有 m m m个标号依次为 [ 1 , m ] [1,m] [1,m]的球, 从这 n n n个盒子中每个盒子取出一个求. 设 F F F为取出 n n n个求的奇数标号的个数, 求所有情况的 F k F^k Fk之和.
Solution
设
P
=
⌈
M
2
⌉
M
P=\frac{\lceil\frac{M}{2}\rceil}{M}
P=M⌈2M⌉, 则从一个盒子中取出奇数标号的概率为
P
P
P. 则有概率基本定理可知
A
n
s
=
m
n
∑
i
=
0
n
P
i
(
1
−
P
)
n
−
i
C
n
i
i
k
Ans=m^n\sum_{i=0}^nP^i(1-P)^{n-i}C_n^ii^k
Ans=mn∑i=0nPi(1−P)n−iCniik.
A
n
s
=
m
n
∑
i
=
0
n
P
i
(
1
−
P
)
n
−
i
C
n
i
∑
j
=
0
min
{
n
,
k
}
S
2
(
k
,
j
)
i
j
‾
=
m
n
∑
j
=
0
min
{
n
,
k
}
S
2
(
k
,
j
)
∑
i
=
0
n
P
i
(
1
−
P
)
n
−
i
n
!
(
n
−
i
)
!
i
!
⋅
i
!
(
i
−
j
)
!
=
m
n
∑
j
=
0
min
{
n
,
k
}
S
2
(
k
,
j
)
∑
i
=
0
n
P
i
(
1
−
P
)
n
−
i
(
n
−
j
)
!
(
n
−
i
)
!
(
i
−
j
)
!
⋅
n
!
(
n
−
j
)
!
=
m
n
∑
j
=
0
min
{
n
,
k
}
S
2
(
k
,
j
)
n
!
(
n
−
j
)
!
∑
i
=
0
n
P
i
(
1
−
P
)
n
−
i
C
n
−
j
n
−
i
=
m
n
∑
j
=
0
min
{
n
,
k
}
S
2
(
k
,
j
)
×
n
j
‾
×
P
j
∑
i
=
0
n
P
i
−
j
(
1
−
P
)
n
−
i
C
n
−
j
i
=
m
n
∑
j
=
0
min
{
n
,
k
}
S
2
(
k
,
j
)
×
n
j
‾
×
P
j
[
P
+
(
1
−
P
)
]
n
−
j
=
m
n
∑
j
=
0
min
{
n
,
k
}
S
2
(
k
,
j
)
×
n
j
‾
×
P
j
\begin{aligned} Ans&=m^n\sum_{i=0}^nP^i(1-P)^{n-i}C_n^i\sum_{j=0}^{\min\{n,k\}}S_2(k,j)i^{\underline j}\\ &=m^n\sum_{j=0}^{\min\{n,k\}}S_2(k,j)\sum_{i=0}^nP^i(1-P)^{n-i}\frac{n!}{(n-i)!i!}\cdot\frac{i!}{(i-j)!}\\ &=m^n\sum_{j=0}^{\min\{n,k\}}S_2(k,j)\sum_{i=0}^nP^i(1-P)^{n-i}\frac{(n-j)!}{(n-i)!(i-j)!}\cdot\frac{n!}{(n-j)!}\\ &=m^n\sum_{j=0}^{\min\{n,k\}}S_2(k,j)\frac{n!}{(n-j)!}\sum_{i=0}^nP^i(1-P)^{n-i}C_{n-j}^{n-i}\\ &=m^n\sum_{j=0}^{\min\{n,k\}}S_2(k,j)\times n^{\underline j}\times P^j\sum_{i=0}^nP^{i-j}(1-P)^{n-i}C_{n-j} ^i\\ &=m^n\sum_{j=0}^{\min\{n,k\}}S_2(k,j)\times n^{\underline j}\times P^j[P+(1-P)]^{n-j}\\ &=m^n\sum_{j=0}^{\min\{n,k\}}S_2(k,j)\times n^{\underline j}\times P^j \end{aligned}
Ans=mni=0∑nPi(1−P)n−iCnij=0∑min{n,k}S2(k,j)ij=mnj=0∑min{n,k}S2(k,j)i=0∑nPi(1−P)n−i(n−i)!i!n!⋅(i−j)!i!=mnj=0∑min{n,k}S2(k,j)i=0∑nPi(1−P)n−i(n−i)!(i−j)!(n−j)!⋅(n−j)!n!=mnj=0∑min{n,k}S2(k,j)(n−j)!n!i=0∑nPi(1−P)n−iCn−jn−i=mnj=0∑min{n,k}S2(k,j)×nj×Pji=0∑nPi−j(1−P)n−iCn−ji=mnj=0∑min{n,k}S2(k,j)×nj×Pj[P+(1−P)]n−j=mnj=0∑min{n,k}S2(k,j)×nj×Pj
预处理第二类斯特林数, 时间复杂度为
O
(
k
2
+
T
k
)
O(k^2+Tk)
O(k2+Tk).
Code
# define Fast_IO std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
# include "algorithm"
# include "iostream"
# include "cstdlib"
# include "cstring"
# include "cstdio"
# include "vector"
# include "bitset"
# include "queue"
# include "cmath"
# include "ctime"
# include "map"
# include "set"
# define ll long long
# define ld long double
# define rep1(i,a,b) for(ll i=(a);i<=(b);i++)
# define rep2(i,a,b) for(ll i=(b);i>=(a);i--)
# define pii pair<int,int>
# define pll pair<ll,ll>
# define ph push_back
# define pb pop_back
# define eb emplace_back
# define vi vector<int>
# define vll vector<ll>
# define vpi vector<pii >
# define vpll vector<pll >
# define ri(x) scanf("%d",&x)
# define rf(x) scanf("%f",&x)
# define rl(x) scanf("%lld",&x)
# define rd(x) scanf("%lf",&x)
# define rs(s) scanf("%s",s+1)
# define wi(x) printf("%d",x)
# define wl(x) printf("%lld",x)
# define ws(s) printf("%s",s+1)
# define all(v) v.begin(),v.end()
# define fi first
# define se second
# define repauto(Name,v) for(auto Name:v)
# define Endl "\n"
# define ENDL putchar('\n')
using namespace std;
template<class I> inline I GCD(I A,I B){return B?GCD(B,A%B):A;}
template<class I> inline I LCM(I A,I B){return A/GCD(A,B)*B;}
template<class I> I Sqrt(I N){
I sqrtN=sqrt(N)-1;
while(sqrtN+1<=N/(sqrtN+1))sqrtN++;
return sqrtN;
}
template<class I> I Pow(I X,I Y,__int128 Mod1=998244353){
static __int128 Ans; Ans=1;
for(;Y;Y>>=1,X=(__int128)X*X%Mod1) if(Y&1) Ans=Ans*X%Mod1;
return Ans;
}
namespace Stirling_Class_2nd{
# define Mod 998244353
int Size,*Fac=nullptr,**S2=nullptr;
void Init(int N){
static int i,j;
if(Fac!=nullptr) delete[] Fac; Fac=new int[N+1]();
if(S2!=nullptr){
for(i=1;i<=Size;++i) delete[] S2[i]; delete[] S2;
}S2=new int*[N+1](); S2[0]=new int();
for(Fac[0]=i=1;i<=N;++i){
S2[i]=new int[i+1]();
S2[i][1]=S2[i][i]=1,Fac[i]=(long long)Fac[i-1]*i%Mod;
for(j=2;j<i;++j) S2[i][j]=(S2[i-1][j-1]+(long long)j*S2[i-1][j])%Mod;
}return void(Size=N);
}// N distinct elements into k non-empty subsets
int S(int N,int K){
if(N==K) return 1;
if(N<=0 || K<=0 || N>Size || K>Size || N<K) return 0;
return S2[N][K];
}
# undef Mod
}using namespace Stirling_Class_2nd;
const int maxm=5e3+10;
const int Mod=998244353;
int N,M,K;
long long Res,P,Add;
int main(){
# ifdef LH_Frank
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
# endif
static int i,T;
Init(5000);
for(scanf("%d",&T);T;--T){
Res=0;
scanf("%d%d%d",&N,&M,&K);
P=Pow(M,Mod-2,Mod); P=P*((M+1)/2)%Mod;
for(i=0,Add=1;i<=min(N,K);++i){
Res=(Res+S(K,i)*Add%Mod*Pow(P,(long long)i,Mod))%Mod;
Add=Add*(N-i)%Mod;
}Res=Res*Pow(M,N,Mod)%Mod;
printf("%lld\n",Res);
}
return 0;
}