首页 > 其他分享 >【ZJOI2019】开关(PGF)

【ZJOI2019】开关(PGF)

时间:2022-10-31 08:33:22浏览次数:48  
标签:PGF frac int sum 开关 ZJOI2019 mod kx neq

听说这玩意叫 PGF?

方便起见,令 \(p_i=\frac{p_i}{\sum_jp_j}\)。

设 \(F_i(x)\) 表示对于第 \(i\) 个开关而言,对其进行 \(k\) 次操作之后,它达到目标状态的概率的 EGF(其实文字不好表达 \(F_i(x)\) 的意思,因为它只是一个辅助生成函数。看下去就能理解 \(F_i(x)\) 的用途),那么有:

\[F_i(x)=\sum_{k\geq 0}[k\bmod 2=s_i]\frac{p_i^kx^k}{k!}=\frac{e^{p_ix}+(-1)^{s_i}e^{-p_ix}}{2} \]

然后设 \(G_E(x)\) 表示 \(k\) 次操作后全体恰好达到目标状态的概率的 EGF(这里的释义才是准确的),有:

\[G_E(x)=\prod_{i=1}^nF_i(x) \]

设 \(R_E(x)\) 表示 \(k\) 次操作后恰好达到全 \(0\) 状态的概率的 EGF,类似地有:

\[R_E(x)=\prod_{i=1}^n\left(\sum_{k\geq 0,2|k}\frac{p_i^kx^k}{k!}\right)=\prod_{i=1}^n\left(\frac{e^{p_ix}+e^{-p_ix}}{2}\right) \]

设 \(G_O(x)\) 表示 \(G_E(x)\) 转回 OGF 后的函数,\(R_O(x)\) 同理。

设 \(H(x)\) 表示 \(k\) 次操作后全体恰好达到目标状态、且之前都没有达到过的概率的 OGF。那么:

\[H(x)R_O(x)=G_O(x) \]

我们要求的是 \(H'(1)\)。

但事实上并没有说的那么简单,一个最主要的问题就是 \(R,G\) 都是无限项的,所以我们先要求出 \(R,G\) 的封闭形式。

观察 \(G_E(x)\):

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

发现它展开后封闭形式是 \(\sum_k g_ke^{kx}\),这种形式转 OGF 是方便的:\(G_O(x)=\sum_k \frac{g_k}{1-kx}\)。

那么我们只需求出所有的 \(k\) 和对应的 \(a_k\) 即可。但看起来 \(k\) 的个数貌似是 \(O(2^n)\) 级别的。

事实上,可以发现 \(k\) 一定是 \(\frac{k'}{\sum_{j} p_j}\) 的形式,其中 \(k'\in[-\sum_j p_j,\sum_j p_j]\)。那么 \(k\) 只有 \(O(\sum_jp_j)\) 种。那么我们可以通过一个 \(O(n\sum_jp_j)\) 的 DP 求出每个 \(g_k\)。

同理我们也可以求出 \(R_O(x)=\sum_k\frac{r_k}{1-kx}\)。那么:

\[\begin{aligned} H(x)&=\frac{\sum_{k}\frac{g_k}{1-kx}}{\sum_k\frac{r_k}{1-kx}}\\ &=\frac{g_1+\sum_{k\neq 1}\frac{g_k(1-x)}{1-kx}}{r_1+\sum_{k\neq 1}\frac{r_k(1-x)}{1-kx}} \end{aligned} \]

令 \(A(x)\) 为分母,\(B(x)\) 为分子。有:

\[H(x)'=\frac{A(x)'B(x)-A(x)B(x)'}{B(x)^2} \]

所以我们只需求出 \(A(1),A(1)',B(1),B(1)'\) 即可。这里以 \(A(x)'\) 为例:

\[\begin{aligned} A(x)'&=\left[g_1+\sum_{k\neq 1}\frac{g_k(1-x)}{1-kx}\right]'\\ &=\sum_{k\neq 1}g_k\left[\frac{1-x}{1-kx}\right]'\\ &=\sum_{k\neq 1}g_k\frac{k-1}{(1-kx)^2}\\ A(1)'&=\sum_{k\neq 1}g_k\frac{k-1}{(1-k)^2}\\ &=\sum_{k\neq 1}\frac{g_k}{k-1} \end{aligned} \]

总时间复杂度 \(O(n\sum_jp_j)\)。

#include<bits/stdc++.h>

#define N 110
#define SP 50010

using namespace std;

namespace modular
{
	const int mod=998244353,inv2=(mod+1)>>1;
	inline int add(int x,int y){return x+y>=mod?x+y-mod:x+y;}
	inline int dec(int x,int y){return x-y<0?x-y+mod:x-y;}
	inline int mul(int x,int y){return 1ll*x*y%mod;}
	inline void Add(int &x,int y){x=x+y>=mod?x+y-mod:x+y;}
	inline void Dec(int &x,int y){x=x-y<0?x-y+mod:x-y;}
	inline void Mul(int &x,int y){x=1ll*x*y%mod;}
	inline int poww(int a,int b){int ans=1;for(;b;Mul(a,a),b>>=1)if(b&1)Mul(ans,a);return ans;}
}using namespace modular;

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<<1)+(x<<3)+(ch^'0');
		ch=getchar();
	}
	return x*f;
}

int n,p[N],sp,sp2,invsp;
int g[SP<<1],r[SP<<1];
bool s[N];

void trans(int *f,int p,bool neg)
{
	static int ff[SP<<1];
	int c1=inv2,c2=(neg?dec(0,inv2):inv2);
	for(int i=0;i+p<=sp2;i++) Add(ff[i+p],mul(c1,f[i]));
	for(int i=sp2;i-p>=0;i--) Add(ff[i-p],mul(c2,f[i]));
	for(int i=0;i<=sp2;i++) f[i]=ff[i],ff[i]=0;
}

int calc(int *f)
{
	return f[sp2];
}

int calcd(int *f)
{
	int ans=0;
	for(int i=-sp;i<=sp;i++)
		if(i!=sp) Add(ans,mul(f[i+sp],poww(dec(mul((i+mod)%mod,invsp),1),mod-2)));
	return ans;
}

int main()
{
	n=read();
	for(int i=1;i<=n;i++) s[i]=read();
	for(int i=1;i<=n;i++) Add(sp,p[i]=read());
	sp2=sp<<1,invsp=poww(sp,mod-2);
	g[sp]=r[sp]=1;
	for(int i=1;i<=n;i++) trans(g,p[i],s[i]);
	for(int i=1;i<=n;i++) trans(r,p[i],0);
	int A=g[sp2],Ad=calcd(g),B=r[sp2],Bd=calcd(r);
	printf("%d\n",mul(dec(mul(Ad,B),mul(A,Bd)),poww(mul(B,B),mod-2)));
	return 0;
}

标签:PGF,frac,int,sum,开关,ZJOI2019,mod,kx,neq
From: https://www.cnblogs.com/ez-lcw/p/16843016.html

相关文章

  • 工业和自动化 SIC462ED SIC463ED DC/DC 开关稳压器 应用
    产品参数1、型号:SIC462EDSIC462ED-T1-GE3开关稳压器功能:降压输出配置:正拓扑:降压输出类型:可调式输出数:1电压-输入:4.5V~60V电压-输出:0.8V~55.2V电流-输出:6A频......
  • 628案例演示开关灯 629 BOM概述
    开关灯案例演示也可以说成是图片之间的切换<body><!--指定图片路径和id名称--><imgsrc="img/off.gif"id="deng"><script>/*......
  • Orchestrator global recovery disable 全局开关
    目录1.DB层2.raft同步层3.API层4.snapshot层5.自动故障恢复6.Dashboard页面Orchestrator中,在MySQL集群粒度,有故障自动恢复开关,在全局粒度,也有一个全局的开关(g......
  • 光电液位开关结构及优势
    光电液位开关主要是由透明光锥、发光二极管、线材三个部分组成。光电液位开关有两种形式:一体式和分离式,两者的区别是,一体式的外壳部分结构是光锥形状,分离式的则是将光锥部分......
  • Vue中使用Switch开关用来控制商品的上架与下架情况、同时根据数据库商品的状态反应到
    一般后台对商品的信息管理、包含商品的上架与下架。为了提高用户的体验、将商品上下架的操作做成开关的形式。同时后台数据库中保存的商品状态能够根据开关状态改变。1......
  • C语言多路开关模式的switch语句
    C语言多路开关模式的switch语句将switch语句中有的语句块的break删除掉。使多个语句块输出同一个。例子:输入一个月份,判断是几月份。#define_CRT_SECURE_NO_WARNINGS1#incl......
  • UE4学习笔记9——蓝图 开关门的实现
    P27.【蓝图】开关门互动实现P28.【蓝图】按键+鼠标点击实现开关门P271.首先给门添加碰撞;双击“内容浏览器”中门的模型,进入门的编辑界面在新界面的菜单栏中......
  • 03#嵌入式系统基础:模拟量和开关量
    模拟量指的是实践连续、数值也连续的物理量,例如:温度、压力、流量、速度、声音等。在工程技术上,常用传感器、变换器把模拟量转换为电流、电压或电阻等电学量。开关量指的是......
  • 高压开关柜温升原因及监测方法
    陈盼(安科瑞电气股份有限公司201801)摘要:电力传输系统中,发电厂、变电站的高压开关柜起着关键性的作用,随着电网设备技术的发展,高压开关柜也得到广泛的使用。在使用开关柜的过......
  • 小型机械式光开关
    小型机械光开关具有插入损耗低、稳定性高和可靠性高的特点。它是动态配置加/分多路复用器OADM,交叉连接器OXC,系统监视和保护的理想设备。小包装更容易集成到高密度正面光通信......