口吃

news/2024/9/20 3:57:20/文章来源:https://www.cnblogs.com/onlyblues/p/18419555

口吃

题目描述

Zaoly 要讲一句话,这句话有 n 个字,他要一个字一个字讲出来。奈何 Zaoly 口吃:

  • 讲到第 1 个字时,下一个要讲的字有 $\frac{a_1}{a_1+b_1}$ 的概率前进到第 2 个字,有 $\frac{b_1}{a_1+b_1}$ 的概率仍是第 1 个字。
  • 讲到第 $i$ $(2 \leq i \leq n−1)$ 个字时,下一个要讲的字有 $\frac{a_{i}^{2}}{a_{i}^{2}+2 a_i \cdot b_i + b_{i}^{2}}$ 的概率前进到第 $i+1$ 个字,有 $\frac{2 a_i \cdot b_i}{a_{i}^{2}+2 a_i \cdot b_i + b_{i}^{2}}$ 的概率仍是第 $i$ 个字,有 $\frac{b_{i}^{2}}{a_{i}^{2}+2 a_i \cdot b_i + b_{i}^{2}}$ 的概率倒退到第 $i−1$ 个字。
  • 讲到第 $n$ 个字时,讲话完毕,停止讲话。

直到讲话完毕,Zaoly 总共讲出的字数的期望是多少?

输入描述:

第一行输入一个整数 $n$ $(2 \leq n \leq 10^5)$,表示这句话有 $n$ 个字。

第二行输入 $n−1$ 个数 $a_1, a_2, \ldots, a_{n−1}$ $(1 \leq a_i \leq 10^9)$ 表示数组。

第三行输入 $n−1$ 个数 $b_1, b_2, \ldots, b_{n−1}$ $(1 \leq b_i \leq 10^9)$ 表示数组。

保证对于所有的 $1 \leq i \leq n−1$,都满足 $a_i + b_i = 10^9 +7$。

输出描述:

输出总共讲出的字数的期望。

可以证明答案可以表示为一个不可约分数 $\frac{p}{q}$,为了避免精度问题,请直接输出整数 $( p \cdot q^{−1} \bmod M)$ 作为答案,其中 $M=10^9+7$,$q^{−1}$ 是满足 $q \times q^{−1} \equiv 1 \pmod{M}$ 的整数。

示例1

输入

2
1
1

输出

3

说明

说完第一个字后,有 $1/2$ 的概率直接前进到下一个字,有 $1/4$ 的概率多讲一个字,有 $1/8$ 的概率多讲两个字 $\ldots \ldots$

说出总字数的期望为 $1 + \frac{1}{2} \times 1 + \frac{1}{4} \times 2 + \frac{1}{8} \times 3 + \frac{1}{16} \times 4 + \cdots = 3$。

示例2

输入

3
1 1
1 1

输出

9

示例3

输入

6
1 2 3 4 5
5 4 3 2 1

输出

800000096

 

解题思路

  一开始往贡献法的思路想没做出来,dp 也不会。这 dp 的定义还挺难想到的,定义 $f(i)$ 表示从第 $i$ 个字开始读的期望值,转移方程就是$$f(i) = \frac{a_i^2}{(a_i+b_i)^2} \cdot f(i+1) + \frac{2a_ib_i}{(a_i+b_i)^2} \cdot f(i) + \frac{b_i^2}{(a_i+b_i)^2} \cdot f(i-1) + 1$$

  容易看出这个转移是存在环的。注意到读第 $1$ 个字是不会往前退的,此时有

\begin{align*}
&f(1) = \frac{a_1}{a_1+b_1} \cdot f(2) + \frac{b_1}{a_1+b_1} \cdot f(1) + 1 \\
\Rightarrow &f(1) = f(2) + \frac{a_1+b_1}{a_1}
\end{align*}

  对于 $f(2)$ 就有

\begin{align*}
f(2) &= \frac{a_2^2}{(a_2+b_2)^2} \cdot f(3) + \frac{2a_2b_2}{(a_2+b_2)^2} \cdot f(2) + \frac{b_2^2}{(a_2+b_2)^2} \cdot f(1) + 1 \\
&= \frac{a_2^2}{(a_2+b_2)^2} \cdot f(3) + \frac{2a_2b_2}{(a_2+b_2)^2} \cdot f(2) + \frac{b_2^2}{(a_2+b_2)^2} \cdot \left(f(2) + \frac{a_2+b_2}{a_2}\right) + 1 \\
\Rightarrow f(2) &= \frac{a_2^2}{a_2^2 + b_2^2 - b_2^2 \cdot 1} \cdot f(3) + \frac{b_2^2 \cdot \frac{a_1+b_1}{a_1} + (a_2+b_2)^2}{a_2^2 + b_2^2 - b_2^2 \cdot 1}
\end{align*}

  这样就可以消去环,进一步推导可以发现转移方程都是 $f(i) = x_i \cdot f(i+1) + y_i$ 的形式。其中 $x_i = \frac{a_i^2}{a_i^2 + b_i^2 - b_i^2 \cdot x_{i-1}}$,$y_i = \frac{b_i^2 \cdot y_{i-1} + (a_i+b_i)^2}{a_i^2 + b_i^2 - b_i^2 \cdot x_{i-1}}$,初始时 $x_1 = 1$,$y_1 = \frac{a_1+b_1}{a_1}$。

  由于 $f(n) = 1$,因此我们可以先计算出所有的 $x_i$ 和 $y_i$,然后倒着 dp 依次求出 $f(i)$。

  AC 代码如下,时间复杂度为 $O(n \log{M})$:

#include <bits/stdc++.h>
using namespace std;typedef long long LL;const int N = 1e5 + 5, mod = 1e9 + 7;int a[N], b[N];
int x[N], y[N];
int f[N];int qmi(int a, int k) {int ret = 1;while (k) {if (k & 1) ret = 1ll * ret * a % mod;a = 1ll * a * a % mod;k >>= 1;}return ret;
}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin >> n;for (int i = 1; i < n; i++) {cin >> a[i];}for (int i = 1; i < n; i++) {cin >> b[i];}x[1] = 1, y[1] = LL(a[1] + b[1]) * qmi(a[1], mod - 2) % mod;for (int i = 2; i < n; i++) {int t = qmi((1ll * a[i] * a[i] + 1ll * b[i] * b[i] - 1ll * b[i] * b[i] % mod * x[i - 1]) % mod, mod - 2);x[i] = 1ll * a[i] * a[i] % mod * t % mod;y[i] = (1ll * b[i] * b[i] % mod * y[i - 1] + LL(a[i] + b[i]) * (a[i] + b[i])) % mod * t % mod;}f[n] = 1;for (int i = n - 1; i; i--) {f[i] = (1ll * x[i] * f[i + 1] + y[i]) % mod;}cout << f[1];return 0;
}

 

参考资料

  牛客周赛60题目讲解:https://www.bilibili.com/video/BV1BR4SeYEdi?p=5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/799591.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes Ingress

目录一、为什么需要 Ingress二、什么是Ingress,Ingress Controller三、Ingress 的工作原理四、Ingress 配置资源模版五、实例1、搭建 Ingress 环境1.1、Ingress-Nginx官网地址1.2、master 节点下载 deploy.yaml1.3、所有节点提前 pull 必须的镜像1.4、修改并应用 deploy.yaml 文…

JVM--解析运行期优化与JIT编译器

JVM开发团队一直在努力,缩小Java与C/C++语言在运行效率上的差距。 本篇博客,我们来谈一谈JVM(HotSpot)为了提高Java程序的运行效率,都实现了哪些激动人心的技术~ 1 JIT编译器的引入 首先我们这篇文章中所说的编译器都是指JVM的组成部分之一---即时编译器(JIT),与生成J…

十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)

十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式) @目录十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)1. Spring Boot 配置 MyBatis 的详细步骤2. 最后:MyBatis 的官方文档:https://mybatis.p2hp.com/ 关于 MyBatis 的学习的详细内容,大家可以移步至:✏️✏️…

学习高校课程-软件工程-软件流程(ch3)

3.1 A GENERIC PROCESS MODEL 通用过程模型 线性流和迭代流演化流和并行流3.2 DEFINING A FRAMEWORK ACTIVITY 定义框架活动 What actions are appropriate for a framework activity, given the nature of the problem to be solved, the characteristics of the people doing…

字符编码发展史2 — ISO-8859-N

2.2. 第二个阶段 本地化2.2.1. ANSI 2.2.2. ISO/IEC 8859-N2.2.2.1. 什么是ISO/IEC 8859-N? 2.2.2.2. ISO 8859-1的编码表上一篇《字符编码发展史1 — ASCII和EASCII》我们讲解了字符编码的起源ASCII和EASCII。本篇我们将继续讲解字符编码的第二个发展阶段中的ISO 8859-N。 2.…

?

CF1194G 在外层枚举\(x\)和\(y\),令\(x=x\times t,y=y\times t\),且\(x\times t\)十进制包含\(x\),\(y\)同理。 因为有进位,从低位向高位dp。 设\(f[T][0/1][0/1][i][j][0/1][0/1]\)表示处理到第T位,在当前这些为中\(x\times t\)是否大于\(n\),\(y\times t\)是否大于\(n\),…

网络补充

1. 网卡配置(ip,dns)目标:修改网卡的名字为eth0. 修改网卡配置文件,ip,dns,网关,子网掩码.(物理机,虚拟机(私有云)) 公有云自动获取即可,服务器数量巨大自动获取.1.1 网卡命名 结论: 工作有需求的时候再去修改. 做好记录,后面使用的时候参考即可. # 网卡命名规则: ens33 ensxxx…

在idea中使用mysql失败

在idea中测试mysql显示失败idea方面视图 - 工具窗口 - 数据库 或者右边有图标直接点开新建 - 数据源 - mysql名称 - 用户(root) - 密码 - 测试连接如果测试连接有切换相关提示直接点击, 如果出绿色对勾就成功了 到这里本可以结束了, 但是我最开始做的时候这个流程没有成功 以防…

Pyhton调用R语言rpy2包概要

随着深度学习、大数据和AI的发展,Python的热度持续上升,引发了关于选择Python还是R的讨论。作为数据分析工具,两者各有优缺点。在特定领域,如生态学,R仍被广泛应用,而Python则更多用于日常办公自动化,如批量处理文档和Excel。由于数据处理占用了我们大量时间,很多人希望…

自动驾驶运动规划学习_碰撞检测算法_GJK

自动驾驶运动规划学习:碰撞检测算法:GJK Gilbert–Johnson–Keerthi(GJK)算法,是一种用于检测两个凸集是否重叠的高效算法,并且可以得到两个凸集的最小距离.1.4.1 GJK算法原理1.4.1.1 闵可夫斯基差(Minkowski Difference)1.4.1.3 凸性 在二维空间中,如果一个凸集包含原点,…

设计模式之——代理模式

代理模式 前言: 我们一般在租房子时会去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做;再比如我们打官司需要请律师,因为律师在法律方面有专长,可以替我们进行操作,表达我们的想法;再比如在淘宝上面买东西,你使用支付宝平台…