「SOL」开关(LOJ)
并不套路的概率生成函数
# 题面
随机改变开关的状态——每次有
数据规模:
# 解析
- P1. 一些函数的定义
可以拆解成每一个开关最后要变成指定的状态。
记
- 若
要求最后关闭,则操作偶数次: - 同理,若要求最后打开,操作奇数次:
从概率生成函数的角度考虑,要求期望,则设对应随机变量的概率——设
先不管 OGF 怎么求,难道答案就是
设
最后设出
但是我们现在将
同理,我们也只能快速得到
考虑如何把 EGF 转成 OGF。
- P2. EGF to OGF
注意到
不难发现
只需要把
而知道了
上式的
- P3. 求导
根据之前的推导,我们已经可以求得 OGF
对其求导并代入
注意
但是稍微细心一些,我们发现
若
正无穷除以正无穷?洛必达
考虑
又因为
乘上
# 源代码
Copy/*Lucky_Glass*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
inline int rin(int &r){
int b=1,c=getchar();r=0;
while(c<'0' || '9'<c) b=c=='-'?-1:b,c=getchar();
while('0'<=c && c<='9') r=(r<<1)+(r<<3)+(c^'0'),c=getchar();
return r*=b;
}
const int N=105,M=5e4+10,MOD=998244353;
#define con(type) const type &
inline int add(con(int)a,con(int)b){return a+b>=MOD?a+b-MOD:a+b;}
inline int sub(con(int)a,con(int)b){return a-b<0?a-b+MOD:a-b;}
inline int mul(con(int)a,con(int)b){return int(1ll*a*b%MOD);}
inline int ina_pow(con(int)a,con(int)b){return b?mul(ina_pow(mul(a,a),b>>1),(b&1)?a:1):1;}
inline int inv(con(int)k){return ina_pow(k,MOD-2);}
int n,sump;
int ars[N],arp[N],f[2][M<<1],g[2][M<<1];
int main(){
const int INV2=ina_pow(2,MOD-2);
rin(n);
for(int i=1;i<=n;i++) rin(ars[i]);
for(int i=1;i<=n;i++) sump+=rin(arp[i]);
f[0][sump]=g[0][sump]=1;
for(int i=1,now=0;i<=n;now+=arp[i],i++){
int I=i&1,J=!I;
fill(f[I]+(sump-now-arp[i]),f[I]+(sump+now+arp[i])+1,0);
fill(g[I]+(sump-now-arp[i]),g[I]+(sump+now+arp[i])+1,0);
int *fI=f[I]+sump,*fJ=f[J]+sump,*gI=g[I]+sump,*gJ=g[J]+sump;
for(int j=-now;j<=now;j++){
int val=mul(INV2,fJ[j]);
fI[j+arp[i]]=add(fI[j+arp[i]],val);
if(ars[i]) fI[j-arp[i]]=sub(fI[j-arp[i]],val);
else fI[j-arp[i]]=add(fI[j-arp[i]],val);
val=mul(INV2,gJ[j]);
gI[j+arp[i]]=add(gI[j+arp[i]],val);
gI[j-arp[i]]=add(gI[j-arp[i]],val);
}
}
int *fi=f[n&1]+sump,*gi=g[n&1]+sump;
int invs=ina_pow(sump,MOD-2),f0=fi[sump],g0=gi[sump],f1=0,g1=0;
for(int i=-sump;i<=sump;i++){
int ii=i<0? i+MOD:i,tmp=inv(sub(mul(ii,invs),1));
f1=add(f1,mul(fi[i],tmp));
g1=add(g1,mul(gi[i],tmp));
}
printf("%d\n",mul(sub(mul(f1,g0),mul(g1,f0)),inv(mul(g0,g0))));
return 0;
}
THE END
Thanks for reading!
如若是狂风雪雨
亦或碧空如洗
此生百转千回阴晴只得由你
挥毫执墨笔 把你记作曲
也许 此中音律抚琴为君高歌一曲
——《琴弦上(vocaloid)》By 乐正绫/赤羽/星葵
> Link 琴弦上-Bilibili
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现