CF1716 F-Bags With Balls

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=M2M, 则从一个盒子中取出奇数标号的概率为 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=mni=0nPi(1P)niCniik.
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=0nPi(1P)niCnij=0min{n,k}S2(k,j)ij=mnj=0min{n,k}S2(k,j)i=0nPi(1P)ni(ni)!i!n!(ij)!i!=mnj=0min{n,k}S2(k,j)i=0nPi(1P)ni(ni)!(ij)!(nj)!(nj)!n!=mnj=0min{n,k}S2(k,j)(nj)!n!i=0nPi(1P)niCnjni=mnj=0min{n,k}S2(k,j)×nj×Pji=0nPij(1P)niCnji=mnj=0min{n,k}S2(k,j)×nj×Pj[P+(1P)]nj=mnj=0min{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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值