AT_agc038_e [AGC038E] Gachapon 题解
littlez_meow · · 题解
难得的
题目指路。
题意
有一随机数生成器,每次生成
思路
题面里的所有都出现多少次很不好解决,考虑
【
则答案变成:
其中
加法交换律一下:
整理:
该式的实际意义为,第
但是这个仅仅是在集合内选的期望。我们还要考虑随机生成到集合外。也就是说,上面这个式子还要再乘以随机生成到集合内的期望次数,即概率的倒数,才是
接下来计算第
整理得:
最终答案为:
设
具体地,转移为:
由于带容斥系数,初值
最后答案为
时间复杂度
代码
#include<bits/stdc++.h>
#define F(i,a,b) for(int i(a),i##i##end(b);i<=i##i##end;++i)
#define R(i,a,b) for(int i(a),i##i##end(b);i>=i##i##end;--i)
#define ll long long
#define File(a) freopen(#a".in","r",stdin);freopen(#a".out","w",stdout)
using namespace std;
const int MOD=998244353,MAXN=401;
int n,a[MAXN],b[MAXN],A,B;
int fact[MAXN],invf[MAXN],inv[MAXN];
int po[MAXN][MAXN+10];
int dp[2][MAXN][MAXN];
inline ll qpow(ll base,int expo){
ll res(1);
while(expo){
(expo&1)&&(res=res*base%MOD);
base=base*base%MOD,expo>>=1;
}
return res;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
fact[0]=fact[1]=invf[0]=invf[1]=inv[1]=1;
F(i,2,400) inv[i]=MOD-MOD/i*1ll*inv[MOD%i]%MOD,fact[i]=fact[i-1]*1ll*i%MOD,invf[i]=invf[i-1]*1ll*inv[i]%MOD;
F(i,1,400){
po[i][0]=1;
F(j,1,410) po[i][j]=po[i][j-1]*1ll*i%MOD;
}
cin>>n;
F(i,1,n) cin>>a[i]>>b[i],A+=a[i],B+=b[i];
dp[0][0][0]=MOD-1;
F(i,1,n){
int now(i&1),pre(now^1);
F(j,0,A) F(k,0,B){
int&qwq(dp[now][j][k]);
qwq=dp[pre][j][k];
if(j<a[i]) continue;
F(t,0,min(b[i]-1,k)) qwq=(qwq-dp[pre][j-a[i]][k-t]*1ll*po[a[i]][t]%MOD*invf[t])%MOD+MOD;
}
}
int ans(0);
F(i,0,A) F(j,0,B) ans=(ans+dp[n&1][i][j]*qpow(inv[i],j+1)%MOD*fact[j])%MOD;
cout<<(ans+MOD)*1ll*A%MOD;
return 0;
}