充满套路的一道好题,值得记录,单独拎出来了。
转化一下题意就是求最后一个完成xi≥Bi的期望时间。
典型的Min-max容斥形式 转化一下
E(max{S})=∑∅≠T⊂S(−1)|T|−1E(min{T})
这里max{S}是完成最后一个xi≥Bi的时间所以min{S}就是第一个
考虑如何求E(min{T}) 考虑当前集合T={x1,x2,…,xm}我们求它们所有都没有到达Bx的贡献之和
长这样
SA∑A[xi]∑0≤di<B[xi](∑di)!∑di!∏(A[xi]∑A[xi])di
我来挨个解释一下 SA∑A[xi]是得到一个指定集合内元素的期望时间 (∑di)!∑di!可重元素排列因为每个数出现都是钦定的次数要排列一下 (A[xi]∑A[xi])di是对于集合内指定每个数的概率
当然我们可以把(−1)直接写进柿子里方便dp
考虑对这个柿子里加入一个新的y=xj
SAA[y]+∑A[xi]∑0≤di<B[xi]∑0≤dy<B[y](dy+∑di)!dy!+∑di!(A[y]A[y]+∑A[xi])dy∏(A[xi]A[y]+∑A[xi])di
可以发现 我们只需要记录影响的∑A[xi]和∑di就可以了
其余的只是乘了一个A[xi]didi!
最后用f[n][x][y]状态里记录的∑A[xi]和∑di再算一下总贡献就可以了
因为转移不超过O(∑Bi)次 所以时间复杂度是O((∑Bi)2Ai)
代码实现起来超级简单= =
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define ll long long
#define inf 20021225
#define mdn 998244353
#define N 410
using namespace std;
int read()
{
int s=0,t=1; char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') t=-1; ch=getchar();}
while(ch>='0' && ch<='9') s=s*10+ch-'0',ch=getchar();
return s*t;
}
void upd(int &x,int y){x+=x+y>=mdn?y-mdn:y;}
int ksm(int bs,int mi)
{
int ans=1;
while(mi)
{
if(mi&1) ans=1ll*ans*bs%mdn;
bs=1ll*bs*bs%mdn; mi>>=1;
}
return ans;
}
int f[2][N][N],a[N],b[N],n,s,sa,sb;
int main()
{
n=read();
for(int i=1;i<=n;i++) a[i]=read(),b[i]=read(),sa+=a[i],sb+=b[i];
int cur=0,lst=1; f[cur][0][0]=mdn-1;
for(int i=1;i<=n;i++)
{
cur^=1,lst^=1; memcpy(f[cur],f[lst],sizeof(f[cur]));
for(int p=1,l=0;l<b[i];l++,p=1ll*p*a[i]%mdn*ksm(l,mdn-2)%mdn)
for(int j=a[i];j<=sa;j++) for(int k=l;k<=sb;k++)
upd(f[cur][j][k],mdn-1ll*p*f[lst][j-a[i]][k-l]%mdn);
}
int ans=0;
for(int i=1;i<=sa;i++)
{
int p=1,inv=ksm(i,mdn-2),q=1ll*sa*inv%mdn;
for(int k=0;k<=sb;k++,p=1ll*p*inv%mdn*k%mdn)
upd(ans,1ll*f[cur][i][k]*p%mdn*q%mdn);
}
printf("%d\n",ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端