AT5202 [AGC038E] Gachapon
发现题目所求即为最晚达到出现次数的整数的期望次数,考虑 容斥,将其转化为最早达到出现次数的整数的期望次数:
设集合 ,考虑如何计算该集合的贡献,因为期望的线性性,所以直接求和所有未达到出现次数的状态的期望次数即可,得:
第一项为容斥系数,第二项为随机到该集合元素的期望次数,第三项是可重集排列,因为整数的出现顺序需要考虑,第四项为集合内每个整数随机到的概率。
发现式子主要和 有关,可以考虑 来进行计算。设 为考虑了前 个数, 为 , 为 的所有集合按上面式子去掉与 有关的项的乘积之和。
转移为考虑是否加入第 个数,加入就考虑第 个数和其出现次数对式子的贡献。最后枚举 即可计算答案。
#include<bits/stdc++.h>
#define maxn 410
#define all 400
#define p 998244353
using namespace std;
typedef long long ll;
template<typename T> inline void read(T &x)
{
x=0;char c=getchar();bool flag=false;
while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
if(flag)x=-x;
}
int n,s1,s2;
ll ans;
int a[maxn],b[maxn];
ll f[maxn][maxn][maxn],inv[maxn];
void init()
{
inv[0]=inv[1]=1;
for(int i=2;i<=all;++i) inv[i]=(p-p/i)*inv[p%i]%p;
}
int main()
{
init(),read(n);
for(int i=1;i<=n;++i)
read(a[i]),read(b[i]),s1+=a[i],s2+=b[i];
f[0][0][0]=p-1;
for(int i=1;i<=n;++i)
{
ll v=1;
for(int j=0;j<=s1;++j)
for(int k=0;k<=s2;++k)
f[i][j][k]=f[i-1][j][k];
for(int t=0;t<b[i];++t,v=v*a[i]%p*inv[t]%p)
for(int j=a[i];j<=s1;++j)
for(int k=t;k<=s2;++k)
f[i][j][k]=(f[i][j][k]-f[i-1][j-a[i]][k-t]*v%p+p)%p;
}
for(int j=1;j<=s1;++j)
{
ll v=1;
for(int k=0;k<=s2;++k,v=v*k%p*inv[j]%p)
ans=(ans+f[n][j][k]*s1%p*inv[j]%p*v%p)%p;
}
printf("%lld",ans);
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· 程序员常用高效实用工具推荐,办公效率提升利器!
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 【译】WinForms:分析一下(我用 Visual Basic 写的)