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

题意:

有n个开关,一开始状态都为关闭。每次随机选出一个开关将其状态改变,选出第i个开关的概率为${ p_i \over \sum_{i=1}^n p_i} $,求状态第一次变为s的操作步数。

题解:

考虑先从组合方法入手。
最基本的思路就是枚举一种必定结束的状态,但是这样的状态不一定合法,因为这个状态的前缀可能已经结束了,所以我们可以容斥若干个前缀,强制这些前缀已经结束,来算出这个状态中没有一个前缀能够结束的方案数。
当然,在枚举的过程中,"一种状态"可以通过枚举每一个开关的操作次数\(x_i\),再将这些操作次数排列起来,我们枚举前缀的时候,同样枚举每个开关的操作次数,那么我们可以写出答案的式子:
\[\sum_{x_i} \prod [2|x_i-s_i] \prod q_i^{x_i} \sum_{i=1}^nx_i \sum_{m=0}^{\infty} \sum_{y_{1i};\exists i,y_{1i}>0 } \sum_{y_{2i};\exists i,y_{2i}>0 }... \sum_{y_{mi};\exists i, y_{mi}>0 } \sum_{{z_i};\exists i,z_i>0 }\\
\prod [2|y_{ij}] \prod_{j}[\sum_{i=1}^m y_{ij} +z_i = x_i] (-1)^m {(\sum_{i=1}^m z_i)! \over \prod_{i=1}^n z_i!}\prod_{i=1}^m {(\sum_{j=1}^n y_{ij})! \over \prod_{j=1}^n y_{ij}} \]
\(q_i\)为\(p_i \over \sum p_i\)

看起来十分复杂,其实有很多可以化简的地方,为了保证题解的简洁性,这里不一一赘述。上述式子最难化简的莫过于是\(\sum x_i\),这个其实是一个带权方案数,在算的时候我们可以认为是计算$[y^1]\prod_{i=1}^n (1+x_iy) $,所以只需要记常数项与一次项系数。

用指数型生成函数来表示,可以方便的得到答案式子:
\[F(x)=\prod (e^{q_ix} + q_ixye^{q_ix} +(-1)^{s_i} e^{-q_ix} - (-1)^{s_i} q_i xye^{-q_ix}) \\ =\sum_{i=0}^{\infty} {f_{0i} \over i!}x^i + {f_{1i} \over i!}x^iy\]

\[G(x)=\prod (e^{q_ix} + q_ixye^{q_ix} + e^{-q_ix} - q_i xye^{-q_ix}) \\
=\sum_{i=0}^{\infty}{g_{0i} \over i!}x^i + {g_{1i} \over i!}x^iy\]

记\(f_0(x)=\sum_{i=0}^{\infty}f_{0i}x^i,f_1(x)=\sum_{i=0}^{\infty}f_{1i}x^i,f(x)=f_0(x)+f_1(x)y\)
\(g_0(x)=\sum_{i=0}^{\infty}g_{0i} x^i,g_1(x)=\sum_{i=0}^{\infty}g_{1i}x^i,g(x)=g_0(x)+g_1(x)y\)
以\(F(x)\)为例,\(F(x)=\sum_{i=- \infty}^{\infty} a_i e^{ix} + b_i xy e^{ix}\)
可以得到\(f(x)=\sum_{i=- \infty}^{\infty} {a_i \over 1-ix}+{b_i x\over (1-ix)^2}\)
答案为
\[\lim_{x \to 1 }[y^1]f(x)\sum_{m=0}^{\infty}(-g(x)+1)^m=\lim_{x \to 1}[y^1]{f(x) \over g(x)}\\
={f_2(x)g_1(x) -g_2(x)f_1(x) \over g_1^2(x)}\]
我们发现在\(g_1(x)\)中有\(\frac {1} {1-x}\)的项,在\(f_2(x),g_2(x)\)有\(\frac {1} {(1-x)^2}\)的项,所以我们发现,答案的分子有三阶无穷大的项,分母有二阶无穷大的项。
那么是否意味着答案发散呢?恰恰相反,因为感性理解答案肯定是收敛的,所以我们有理由认为分子上三阶无穷大的系数为0,而事实也确实如此,因为\(f_2(x)与g_2(x)\)的\(1 \over (1-x)^2\)项系数相同,\(f_1(x)与g_1(x)\)的\(1 \over 1-x\)项的系数也相同,我们计算答案,只需要计算分子的二阶无穷大的值除以分母的二阶无穷大的值即可,又因为两个无穷大都为\({1\over (1-x)^2}\),所以是可以约去的。

这种做法与网上的大致相同,但是在处理\(\sum x_i\)项的时候不太一样,网上题解大多是用的求导来解决第i项对答案的贡献为i的问题,而本文观察到了\(\sum x_i = [y^1]\prod (1+x_iy)\)的性质。这种做法无疑具有比较高的扩展性,例如操作开关i需要\(a_i\)的代价,求代价的期望,求导方法便显得十分无力,而这个方法只需要将原式稍稍更改成\(\sum a_i x_i = [y^1]\prod (1+a_ix_iy)\)即可。
code

[ZJOI2019] 开关 (一种扩展性较高的做法)的更多相关文章

  1. 使用Lua脚本语言开发出高扩展性的系统,AgileEAS.NET SOA中间件Lua脚本引擎介绍

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  2. Atitit.软件架构高扩展性and兼容性原理与概论实践attilax总结

    Atitit.软件架构高扩展性and兼容性原理与概论实践attilax总结 1. 什么是可扩展的应用程序?1 2. 松耦合(ioc)2 3. 接口的思考 2 4. 单一用途&模块化,小粒度化2 ...

  3. 优秀开源项目之三:高性能、高并发、高扩展性和可读性的网络服务器架构State Threads

    译文在后面. State Threads for Internet Applications Introduction State Threads is an application library ...

  4. jetbrick,新一代 Java 模板引擎,具有高性能和高扩展性

    新一代 Java 模板引擎,具有高性能和高扩展性. <!-- Jetbrick Template Engineer --> <dependency> <groupId&g ...

  5. TCP接入层的负载均衡、高可用、扩展性架构

    一.web-server的负载均衡 互联网架构中,web-server接入一般使用nginx来做反向代理,实施负载均衡.整个架构分三层: 上游调用层,一般是browser或者APP 中间反向代理层,n ...

  6. (转)mysql数据库高可用高扩展性架构方案实施

    http://shanhu.blog.51cto.com/1293405/1212605-----mysql数据库高可用高扩展性架构方案实施

  7. Android ImageCache图片缓存,使用简单,支持预取,支持多种缓存算法,支持不同网络类型,扩展性强

    本文主要介绍一个支持图片自动预取.支持多种缓存算法的图片缓存的使用及功能.图片较大需要SD卡保存情况推荐使用ImageSDCardCache. 与Android LruCache相比主要特性:(1). ...

  8. 【Java/Android性能优5】 Android ImageCache图片缓存,使用简单,支持预取,支持多种缓存算法,支持不同网络类型,扩展性强

    本文转自:http://www.trinea.cn/android/android-imagecache/ 主要介绍一个支持图片自动预取.支持多种缓存算法.支持二级缓存.支持数据保存和恢复的图片缓存的 ...

  9. 深入NGINX:我们如何设计它的性能和扩展性

    为了更好地理解设计,你需要了解NGINX是如何工作的.NGINX之所以能在性能上如此优越,是由于其背后的设计.许多web服务器和应用服务器使用简单的线程的(threaded).或基于流程的 (proc ...

随机推荐

  1. golang--redis基本介绍

    redis(remote-dictionary-system)即远程字典服务器,是NoSQL数据库: 适合做缓存以及持久化: 免费开源,高性能的分布式内存数据库: redis的安装和使用: 下载Red ...

  2. HTML连载46-浮动元素字围现象、浮动练习

    一.浮动元素的字围现象 div{ float:left; width:100px; height:100px; background-color: red; border:1px solid blac ...

  3. linux与ubuntu下vsftp的安装使用

    vsftp工具是linux与类linux系统上常用的ftp传输工具,按百度上的说法,它的不同点与好处有九点,不明觉厉,有兴趣的可以深入验证: 一.它是一个安全.高速.稳定的FTP服务器: 二.它可以做 ...

  4. #3144. 「APIO 2019」奇怪装置

    #3144. 「APIO 2019」奇怪装置 题目描述 考古学家发现古代文明留下了一种奇怪的装置.该装置包含两个屏幕,分别显示两个整数 \(x\) 和 \(y\). 经过研究,科学家对该装置得出了一个 ...

  5. python3编码问题总结

    关于python3的编码类型,到底是怎么编码的,一直使我比较疑惑,在看了网上很多帖子之后,经过自己尝试与实验,将自己的总结写在下面,一是当做一次笔记,二是希望网友们能指正.仅供参考,欢迎指正,谢谢!! ...

  6. 前端优化,包括css,jss,img,cookie

    前端优化,来自某懒观看麦子学院视频的笔记. 尽可能减少HTTP的请求数 使用CDN 添加Expirs头,或者Cache-control Gzip组件压缩文件内容 将CSS放在页面上方 将脚本放到页面下 ...

  7. 避免Java中NullPointerException的Java技巧和最佳实践

    Java中的NullPointerException是我们最经常遇到的异常了,那我们到底应该如何在编写代码是防患于未然呢.下面我们就从几个方面来入手,解决这个棘手的​问题吧.​ 值得庆幸的是,通过应用 ...

  8. IT兄弟连 Java语法教程 流程控制语句 循环结构语句1

    循环语句可以在满足循环条件的情况下,反复执行某一点代码,这段被重复执行的代码被称为循环体,当反复执行这个循环体时,需要在合适的时候把循环条件该为假,从而结束循环,否则循环将一直执行下去,形成死循环.循 ...

  9. 【CF704D】Captain America(上下界网络流)

    [CF704D]Captain America(上下界网络流) 题面 CF 洛谷 题解 如果没有限制,似乎就不用做了...因为我们只需要贪心的选择代价较小的颜色就行了. 那么我们不妨假设染红色的代价较 ...

  10. oidc hybrid flow 与另外两种模式的异同

    很多学习identityserver的文章都没有解释清楚oidc hybrid混合模式的含义.本文将解释hybrid模式与另外两种模式的主要区别. 我们先看一下一手文档: https://openid ...