注:以下p[i]均表示概率

设F(x)为按i次开关后到达终止状态方案数的EGF,显然F(x)=π(ep[i]x/p+(-1)s[i]e-p[i]x/p)/2,然而方案包含一些多次到达合法方案的状态,需将其排除。n次操作回到原状态的方案数的生成函数G(x)=π(ep[i]x/p+e-p[i]x/p)/2。实现时只需要记录F(x)=Σa[i]eix/P中a[i](-P<=i<=P)的系数即可(G(x)也一样),于是暴力复杂度O(nP)。H(x)为答案的生成函数,显然F、G、H所对应的OGF f、g、h满足f(x)=g(x)h(x)。然后就是EGF向OGF的转化:F(x)=Σa[i]eix/P→f(x)=Σa[i]/(1-ix/P),其中-P<=i<=P,于是此时要求h'(1),然后根据除法求导公式,可以计算出h'(x),但x=1时函数不收敛。然后推一下式子就发现本题其实是背包DP了(这里打数学公式太累了就省略一些内容了),复杂度O(nP)

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+,mid=1e5,mod=;
int n,sp,ans,s[N],a[N],f[N],g[N],tmp[N];
int qpow(int a,int b)
{
int ret=;
while(b)
{
if(b&)ret=1ll*ret*a%mod;
a=1ll*a*a%mod,b>>=;
}
return ret;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&s[i]);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
f[mid]=g[mid]=;
for(int i=;i<=n;i++)
{
sp+=a[i];
for(int j=-sp;j<=sp;j++)tmp[j+mid]=(g[j-a[i]+mid]+g[j+a[i]+mid])%mod;
memcpy(g,tmp,sizeof g);
for(int j=-sp;j<=sp;j++)tmp[j+mid]=(f[j-a[i]+mid]+(s[i]?mod-f[j+a[i]+mid]:f[j+a[i]+mid]))%mod;
memcpy(f,tmp,sizeof f);
}
for(int i=-sp;i<sp;i++)ans=(ans+1ll*(g[i+mid]-f[i+mid]+mod)*qpow(sp-i,mod-))%mod;
ans=1ll*ans*sp%mod;
printf("%d",ans);
}

[ZJOI2019]开关(生成函数+背包DP)的更多相关文章

  1. HDU-1171 Big Event in HDU(生成函数/背包dp)

    题意 给出物品种类,物品单价,每种物品的数量,尽可能把其分成价值相等的两部分. 思路 背包的思路显然是用一半总价值当作背包容量. 生成函数则是构造形如$1+x^{w[i]}+x^{2*w[i]}+.. ...

  2. [ZJOI2019] 开关 (一种扩展性较高的做法)

    [ZJOI2019] 开关 (一种扩展性较高的做法) 题意: 有n个开关,一开始状态都为关闭.每次随机选出一个开关将其状态改变,选出第i个开关的概率为${ p_i \over \sum_{i=1}^n ...

  3. 背包dp整理

    01背包 动态规划是一种高效的算法.在数学和计算机科学中,是一种将复杂问题的分成多个简单的小问题思想 ---- 分而治之.因此我们使用动态规划的时候,原问题必须是重叠的子问题.运用动态规划设计的算法比 ...

  4. hdu 5534 Partial Tree 背包DP

    Partial Tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...

  5. HDU 5501 The Highest Mark 背包dp

    The Highest Mark Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ...

  6. Codeforces Codeforces Round #319 (Div. 2) B. Modulo Sum 背包dp

    B. Modulo Sum Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/577/problem/ ...

  7. noj [1479] How many (01背包||DP||DFS)

    http://ac.nbutoj.com/Problem/view.xhtml?id=1479 [1479] How many 时间限制: 1000 ms 内存限制: 65535 K 问题描述 The ...

  8. HDU 1011 树形背包(DP) Starship Troopers

    题目链接:  HDU 1011 树形背包(DP) Starship Troopers 题意:  地图中有一些房间, 每个房间有一定的bugs和得到brains的可能性值, 一个人带领m支军队从入口(房 ...

  9. BZOJ 1004: [HNOI2008]Cards( 置换群 + burnside引理 + 背包dp + 乘法逆元 )

    题意保证了是一个置换群. 根据burnside引理, 答案为Σc(f) / (M+1). c(f)表示置换f的不动点数, 而题目限制了颜色的数量, 所以还得满足题目, 用背包dp来计算.dp(x,i, ...

随机推荐

  1. 十四、CI框架之数据库以参数形式插入操作

    一.代码如下: 二.使用浏览器打开 三.我们查看数据库,被成功插入数据 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码打赏任意金额给作者(微信号:382477247)哦,谢谢.

  2. SQL常用短语小记-持续更新

    创建链接服务器语句 --//创建链接服务器[在本地服务器创建] exec sp_addlinkedserver '链接服务器名称','','SQLOLEDB','远程服务器地址' -- exec sp ...

  3. mybatis的批量update

    方法有三种:1.通过java代码batch方式,xml文件只需一条update语句.java代码繁琐 2.xml使用foreach,“;”分割多条update语句,要求:jdbc的url需加上allo ...

  4. WordPress站点绑定多个域名

    refer to https://blog.csdn.net/wzl505/article/details/54970321 打开根目录下的 wp-config.php 文件,找到 require_o ...

  5. POJ - 3279 Fliptile(反转---开关问题)

    题意:有一个M*N的网格,有黑有白,反转使全部变为白色,求最小反转步数情况下的每个格子的反转次数,若最小步数有多个,则输出字典序最小的情况.解不存在,输出IMPOSSIBLE. 分析: 1.枚举第一行 ...

  6. Neo4j--常用的查询语句

    参考 https://www.w3cschool.cn/neo4j 准备工作 插入一堆朝代节点 插入我大明皇帝节点 创建大明皇帝统治大明王朝的关系 看一下结果 WHERE WHERE 语法 WHERE ...

  7. 吴裕雄--天生自然JAVA线程编程笔记:创建线程

    public class ThreadRuning extends Thread{ public ThreadRuning(String name){ //重写构造,可以对线程添加名字 super(n ...

  8. SQL基础教程(第2版)第6章 函数、谓词、CASE表达式:练习题

    END) AS low_price, END) AS mid_price, END) AS high_price FROM Product; 6_2.sql

  9. 2020/1/29 PHP代码审计之XSS漏洞

    0x00 XSS漏洞简介 人们经常将跨站脚本攻击(Cross Site Scripting)缩写为CSS,但这会与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆.因此,有 ...

  10. vue 动画框架Animate.css @keyframes

    <script src="vue.js"></script> <link rel="stylesheet" href=" ...