传送门

Description

有一些一开始全都是关的开关,每次随机选择一个(每个开关概率不同)开关并改变它的状态,问达到目标状态的期望步数

Solution 

\(P=\sum_{i=1}^{n}p_i\)

求出\(k\)步达到目标状态的概率的\(EGF\)

\[F(x)=\prod_{i=1}^n\frac{e^{\frac{p_ix}{P}}+(-1)^{s_i}e^{-\frac{p_ix}{P}}}{2}
\]

再求出\(k\)步回到原来的状态的概率的\(EGF\)

\[G(x)=\prod_{i=1}^n\frac{e^{\frac{p_ix}{P}}+e^{-\frac{p_ix}{P}}}{2}
\]

对于上述函数,可以用背包求出\(F(x)=\sum_{i=-P}^P a_ie^{\frac{ix}{P}}\)中的系数\(a_i\),\(G(x)\)的系数为\(b_i\)

设\(k\)步到达且不多次到达目标状态的概率的\(EGF\)为\(H(x)\)

设\(H(x),F(x),G(x)\)对应的\(OGF\)分别是\(h(x),f(x),g(x)\)

那么可知\(g(x)h(x)=f(x)\)

如何实现\(EGF\)到\(OGF\)的转化?

\[\begin{equation}
\begin{split}
F(x)&=\sum_{i=-P}^Pa_ie^{\frac{ix}{P}}
\\&=\sum_{i=-P}^P a_i\sum_{j\geq0}\frac{(\frac{ix}{P})^j}{j!}
\end{split}
\end{equation}
\]

所以

\[f(x)=\sum_{i=-P}^P\frac{a_i}{1-\frac{ix}{P}}
\]

发现我们要求的答案就是\(h'(1)\)

\[h'(1)=(\frac{f(1)}{g(1)})'=\frac{f'(1)g(1)-f(1)g'(1)}{g^2(1)}
\]

计算时,把\(f,g\)同乘上\(\prod_{i=_P}^P(1-\frac{ix}{P})\)。下述\(f,g\)均已乘上左式。

计算得到:

\[f(1)=a_P\prod_{i=-P}^{P-1}(1-\frac{i}{P})
\\g(1)=b_P\prod_{i=-P}^{P-1}(1-\frac{i}{P})
\]

求导得到:

\[f'(1)=\sum_ia_i\sum_{j\neq i}-\frac{j}{P}\prod_{k\neq i,k\neq j}(1-\frac{k}{P})\\g'(1)=\sum_ib_i\sum_{j\neq i}-\frac{j}{P}\prod_{k\neq i,k\neq j}(1-\frac{k}{P})
\]

整理得到:

\[f'(1)=-(\sum_{i\neq P}\frac{a_i+a_P\cdot \frac{i}{P}}{1-\frac{i}{P}})(\prod_{i \neq P} (1-\frac{i}{P}))
\\
g'(1)=-(\sum_{i\neq P}\frac{b_i+b_P\cdot \frac{i}{P}}{1-\frac{i}{P}})(\prod_{i \neq P} (1-\frac{i}{P}))
\]

直接代入\(a_P=b_P=2^{-n}\),最后答案为\(2^n\sum_{i\neq P}\frac{b_i-a_i}{1-\frac{i}{P}}\)

Code 

#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define reg register
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
const int MX=5e4+5,M=998244353,inv2=(M+1)>>1;
int Mul(int x,int y){return (1ll*x*y)%M;}
int Add(int x,int y){return (x+y)%M;}
int fpow(int x,int y=M-2){int r=1;for(;y;y>>=1,x=Mul(x,x))if(y&1)r=Mul(r,x);return r;}
int n,a[MX<<1],b[MX<<1],s[105],p[105],P=0;
int f[2][MX<<1],g[2][MX<<1];
int _(int x){return x+P;}
int main()
{
n=read();register int i,j,k;
for(i=1;i<=n;++i) s[i]=read();
for(i=1;i<=n;++i) p[i]=read(),P+=p[i];
f[0][P]=g[0][P]=1;
for(k=0,i=1;i<=n;k+=p[i],++i)
{
memset(f[i&1],0,sizeof f[i&1]);
memset(g[i&1],0,sizeof g[i&1]);
for(j=-k;j<=k;++j)
f[i&1][_(j+p[i])]=Add(f[i&1][_(j+p[i])],Mul(f[(i&1)^1][_(j)],inv2)),
f[i&1][_(j-p[i])]=Add(f[i&1][_(j-p[i])],Mul(f[(i&1)^1][_(j)],s[i]?M-inv2:inv2)),
g[i&1][_(j+p[i])]=Add(g[i&1][_(j+p[i])],Mul(g[(i&1)^1][_(j)],inv2)),
g[i&1][_(j-p[i])]=Add(g[i&1][_(j-p[i])],Mul(g[(i&1)^1][_(j)],inv2));
}
int ans=0,invP=fpow(P);
for(i=-P;i<P;++i)ans=Add(ans,Mul(Add(g[n&1][_(i)],M-f[n&1][_(i)]),fpow(Add(1,M-Mul(i,invP)))));
return 0*printf("%d\n",Mul(ans,fpow(2,n)));
}

Blog来自PaperCloud,未经允许,请勿转载,TKS!

「ZJOI2019」开关的更多相关文章

  1. Loj #3045. 「ZJOI2019」开关

    Loj #3045. 「ZJOI2019」开关 题目描述 九条可怜是一个贪玩的女孩子. 这天,她和她的好朋友法海哥哥去玩密室逃脱.在他们面前的是 \(n\) 个开关,开始每个开关都是关闭的状态.要通过 ...

  2. LOJ 3045: 洛谷 P5326: 「ZJOI2019」开关

    题目传送门:LOJ #3045. 题意简述 略. 题解 从高斯消元出发好像需要一些集合幂级数的知识,就不从这个角度思考了. 令 \(\displaystyle \dot p = \sum_{i = 1 ...

  3. 「ZJOI2019」&「十二省联考 2019」题解索引

    「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...

  4. LOJ3044. 「ZJOI2019」Minimax 搜索

    LOJ3044. 「ZJOI2019」Minimax 搜索 https://loj.ac/problem/3044 分析: 假设\(w(1)=W\),那么使得这个值变化只会有两三种可能,比\(W\)小 ...

  5. Loj #3044. 「ZJOI2019」Minimax 搜索

    Loj #3044. 「ZJOI2019」Minimax 搜索 题目描述 九条可怜是一个喜欢玩游戏的女孩子.为了增强自己的游戏水平,她想要用理论的武器武装自己.这道题和著名的 Minimax 搜索有关 ...

  6. Loj #3042. 「ZJOI2019」麻将

    Loj #3042. 「ZJOI2019」麻将 题目描述 九条可怜是一个热爱打麻将的女孩子.因此她出了一道和麻将相关的题目,希望这题不会让你对麻将的热爱消失殆尽. 今天,可怜想要打麻将,但是她的朋友们 ...

  7. 【LOJ】#3046. 「ZJOI2019」语言

    LOJ#3046. 「ZJOI2019」语言 先orz zsy吧 有一个\(n\log^3n\)的做法是把树链剖分后,形成logn个区间,这些区间两两搭配可以获得一个矩形,求矩形面积并 然后就是对于一 ...

  8. 【LOJ】#3044. 「ZJOI2019」Minimax 搜索

    LOJ#3044. 「ZJOI2019」Minimax 搜索 一个菜鸡的50pts暴力 设\(dp[u][j]\)表示\(u\)用\(j\)次操作能使得\(u\)的大小改变的方案数 设每个点的初始答案 ...

  9. 【LOJ】#3042. 「ZJOI2019」麻将

    LOJ#3042. 「ZJOI2019」麻将 如何判定一个集合牌有没有胡的子集是不是胡的 就用一个\(dp[j][k][0/1]\)表示有j个连续两个的串,有k个连续1个串,有没有对子,再记一下这个集 ...

随机推荐

  1. [golang]按图片中心旋转后的新图左顶点和原图左顶点的偏移量计算

    1 前言 略,作为记录使用 2 代码 /** * @Author: FB * @Description: * @File: RotateSample.go * @Version: 1.0.0 * @D ...

  2. MySQL路线

    一 数据库简介与安装 二 库操作 三 表操作 四 数据操作 五 索引原理与慢查询优化 六 数据备份与慢查询优化 七 视图.触发器.事务.存储过程.函数

  3. 【开发工具】-解决Myeclipse 的 Server窗口报空指针错误

    Eclipse 或者 MyEclipse  查看 server面板的时候,报错,如图所示,错误 代码:java.lang.NullPointerException .另外,由于此错误,导致 项目不能够 ...

  4. Java 之 ServletContext 对象

    ServletContext 对象 一.概念 ServletContext对象:代表整个 web 应用,可以和程序的容器(服务器)来通信. 二.获取 1.通过request 获取 方法: reques ...

  5. 【DATAGUARD】物理dg配置客户端无缝切换 (八.4)--ora-16652 和 ora-16603错误

    [DATAGUARD]物理dg配置客户端无缝切换 (八.4)--ora-16652 和 ora-16603错误 一.1  BLOG文档结构图       一.2  前言部分   一.2.1  导读 各 ...

  6. 不依赖Python第三方库实现梯度下降

    认识 梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模), 我感觉, 其实就是偏导数向量方向 ...

  7. 教你如何配置linux用户实现禁止ssh登陆机器但可用sftp登录!

    构想和目标最近有个这样的诉求:基于对线上服务器的保密和安全,不希望开发人员直接登录线上服务器,因为登录服务器的权限太多难以管控,如直接修改代码.系统配置,并且也直接连上mysql.因此希望能限制开发人 ...

  8. prometheus-redis-exporter监控redis

    chart地址:https://github.com/helm/charts/tree/master/stable/prometheus-redis-exporter 1.下载chart包 $ hel ...

  9. Gradle 使用教程之 Task 详解

    最近打算学习下 gradle 在 Android 中的使用,结果百度出来的文章都是介绍性文章,没啥干货.后来找到 gradle 官网教程,自己对着撸. Gradle 概述: Gradle 是一个基于 ...

  10. 浅谈Linux下傻瓜式磁盘分区工具cfdisk的使用

    对于新手来说,Linux环境下的磁盘分区可能还会存在一些困难.对于熟悉Linux的朋友来说,我们还有fdisk.parted(2TB以上的磁盘分区使用)等磁盘分区工具可以使用.在我们新增磁盘或者在原来 ...