题解-CF1139D Steps to One
题面
一个数列,每次随机选一个 \([1,m]\) 之间的数加在数列末尾,数列中所有数的 \(\gcd=1\) 时停止,求期望长度 \(\bmod 10^9+7\)。
数据范围:\(1\le m\le 10^5\)。
蒟蒻语
这题的非 dp 做法讲得太玄了而且写题解的人貌似不屑于解释,于是蒟蒻来写一篇。
(其实是 ubuntu 剪贴板炸了没得记录题目了只好写题解了)。
蒟蒻解
先推一波概率期望式(\(E(x)\) 是 \(x\) 的期望,\(P(x)\) 是 \(x\) 事件的概率)。
E(len)=&\sum_{i\ge 1}P(len=i)\cdot i\\
=&\sum_{i\ge 1}P(len=i)\sum_{j=1}^i\\
=&\sum_{j\ge 1}\sum_{i\ge j}P(len=i)\\
=&\sum_{i\ge 1}P(len\ge i)\\
=&1+\sum_{i\ge 1}P(len>i)\\
\end{split}
\]
因为 \(\gcd_{i=1}^{len} a_i=1\) 就结束了,所以:
P(len>i)=&P\left(\left(\gcd_{j=1}^{i} a_i\right)>1\right)\\
=&1-P\left(\left(\gcd_{j=1}^{i} a_i\right)=1\right)\\
=&1-\frac{\sum_{a_1=1}^m\sum_{a_2=1}^m\cdots\sum_{a_i=1}^m\epsilon\left(\left(\gcd_{j=1}^{i} a_i\right)\right)}{m^i}\\
=&^{\color{#aa88cc}{(1)}}1-\frac{\sum_{a_1=1}^m\sum_{a_2=1}^m\cdots\sum_{a_i=1}^m\sum_{d|\left(\gcd_{j=1}^{i} a_i\right)}\mu(d)}{m^i}\\
=&1-\frac{\sum_{d=1}^m\mu(d)\sum_{a_1=1}^m[d|a_1]\sum_{a_2=1}^m[d|a_2]\cdots\sum_{a_i=1}^m[d|a_i]}{m^i}\\
=&1-\frac{\sum_{d=1}^m\mu(d)\left(\lfloor\frac{m}{d}\rfloor\right)^i}{m^i}\\
=&^{\color{#eeaa22}{(2)}}-\frac{\sum_{d=2}^m\mu(d)\left(\lfloor\frac{m}{d}\rfloor\right)^i}{m^i}\\
\end{split}
\]
\(\color{#aa88cc}{(1)}\) 就是一个莫反,\(\color{#eeaa22}{(2)}\) 就是把 \(d=1\) 的值和 \(1\) 抵消掉。
带回上式:
E(len)=&1+\sum_{i\ge 1}P(len>i)\\
=&1-\sum_{i\ge 1}\frac{\sum_{d=2}^m\mu(d)\left(\lfloor\frac{m}{d}\rfloor\right)^i}{m^i}\\
=&1-\sum_{i\ge 1}\frac{1}{m^i}\sum_{d=2}^m\mu(d)\left(\lfloor\frac{m}{d}\rfloor\right)^i\\
=&1-\sum_{d=2}^m\mu(d)\sum_{i\ge 1}\left(\frac{\lfloor\frac{m}{d}\rfloor}{m}\right)^i\\
=&^{\color{#ff2211}{(3)}}1-\sum_{d=2}^m\mu(d)\frac{\lfloor\frac{m}{d}\rfloor}{m-\lfloor\frac{m}{d}\rfloor}\\
\end{split}
\]
\(\color{#ff2211}{(3)}\) 是无穷等比数列求值:
sx=x^2+x^3+x^4+\cdots\\
s-sx=x\\
s=\frac{x}{1-x}\\
\]
然后就可以筛个 \(\mu(i)\) 就可以 \(\Theta(m)\) 地算了,当然您可以杜教到 \(\Theta(m^{\frac 23})\),但是那么秀有什么意思呢……
代码
#include <bits/stdc++.h>
using namespace std;
//Start
typedef long long ll;
typedef double db;
#define mp(a,b) make_pair((a),(b))
#define x first
#define y second
#define be(a) (a).begin()
#define en(a) (a).end()
#define sz(a) int((a).size())
#define pb(a) push_back(a)
#define R(i,a,b) for(int i=(a),I=(b);i<I;i++)
#define L(i,a,b) for(int i=(a),I=(b);i>I;i--)
const int iinf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;
//Data
const int mod=1e9+7;
//Sieve
struct sieve{
int n;
vector<bool> np;
vector<int> prime,mu,inv;
void Sieve(){
np[1]=true,mu[1]=1;
R(i,2,n){
if(!np[i]) prime.pb(i),mu[i]=-1;
for(int p:prime){
if(!(i*p<n)) break;
np[i*p]=true;
if(i%p==0){mu[i*p]=0;break;}
mu[i*p]=mu[i]*mu[p];
}
}
inv[1]=1;
R(i,2,n) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
}
sieve(int _n){
n=_n,np.assign(n,false),inv.resize(n);
prime.clear(),mu.resize(n),Sieve();
}
};
//Main
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int n; cin>>n;
sieve math(n+1);
int ans=1;
R(i,2,n+1) (ans+=mod-1ll*(mod+math.mu[i])%mod
*(n/i)%mod*math.inv[n-n/i]%mod)%=mod;
cout<<ans<<'\n';
return 0;
}
祝大家学习愉快!
题解-CF1139D Steps to One的更多相关文章
- CF1139D Steps to One 题解【莫比乌斯反演】【枚举】【DP】
反演套 DP 的好题(不用反演貌似也能做 Description Vivek initially has an empty array \(a\) and some integer constant ...
- CF1139D Steps to One
题目链接:洛谷 这个公式可真是个好东西.(哪位大佬知道它叫什么名字的?) 如果$X$恒$\geq 0$,那么 $$E[X]=\int_0^{+\infty}P(X>t)dt$$ 呸,我什么都没写 ...
- cf1139D. Steps to One(dp)
题意 题目链接 从\([1, M]\)中随机选数,问使得所有数gcd=1的期望步数 Sol 一个很显然的思路是设\(f[i]\)表示当前数为\(i\),期望的操作轮数,转移的时候直接枚举gcd \(f ...
- CF1139D Steps to One(DP,莫比乌斯反演,质因数分解)
stm这是div2的D题……我要对不住我这个紫名了…… 题目链接:CF原网 洛谷 题目大意:有个一开始为空的序列.每次操作会往序列最后加一个 $1$ 到 $m$ 的随机整数.当整个序列的 $\gcd ...
- CF1139D Steps to One (莫比乌斯反演 期望dp)
\[ f[1] = 0 \] \[ f[i] = 1 + \frac{1}{m} \sum_{j = 1} ^ n f[gcd(i, j)] \ \ \ \ \ \ (i != 1) \] 然后发现后 ...
- 【期望dp 质因数分解】cf1139D. Steps to One
有一种组合方向的考虑有没有dalao肯高抬啊? 题目大意 有一个初始为空的数组$a$,按照以下的流程进行操作: 在$1\cdots m$中等概率选出一个数$x$并添加到$a$的末尾 如果$a$中所有元 ...
- 【CF1139D】Steps to One(动态规划)
[CF1139D]Steps to One(动态规划) 题面 CF 你有一个数组,每次随机加入一个\([1,n]\)的数,当所有数\(gcd\)为\(1\)时停止,求数组长度的期望. 题解 设\(f[ ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 【题解】【数组】【查找】【Leetcode】Search in Rotated Sorted Array
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...
随机推荐
- 基于FFmpeg的Dxva2硬解码及Direct3D显示(五)
解码及显示 目录 解码及显示 解码 显示 资源清理 解码 循环读取视频帧 AVPacket packet = { 0 }; while (av_read_frame(m_pFmtCtx, &p ...
- ceph luminous bluestore热插拔实现
需求描述 在某些测试场景下面,需要满足能够拔盘以后在插入的时候能够自动上线磁盘,这个需求实际在生产中是不建议使用的,原因是插入的磁盘如果本身存在问题,那么拉起的操作可能会破坏了本身集群的稳定性,所以这 ...
- 一篇文章了解_unittest
1. 基本概念 2018年10月7日 星期日 11:39 unittest是python自带的单元测试框架,有时候又被称为"PyUnit",是python版本的JUint实现. 该 ...
- 原生javascript包装一个ajax方法
调用AJAX 1 <script type="text/javascript" src="ajax.js"></script> 2 &l ...
- SpringBoot整合MyBatis,HiKari、Druid连接池的使用
SpringBoot整合MyBatis 1.创建项目时勾选mybatis.数据库驱动. mysql驱动默认是8.x的版本,如果要使用5.x的版本,创建后到pom.xml中改. 也可以手动添加依赖 ...
- guitar pro系列教程(二):Guitar Pro主界面之记谱功能的详细解析【下】
本章节我们接着上一章节继续讲解关于guitar pro主界面的记谱功能里的符号功能.有兴趣的朋友可以进来一起学习哦. 首先我们看下图,这是点击按钮便会弹出的一个窗口,进入这个窗口,我们会看到" ...
- js 时间日期与时间戳之间转换
1 1.将时间(2017-08-10)转换时间戳 2 var startTime = '2017-08-10'; 3 var startdate = new Date(Date.parse(start ...
- yii的pathinfo方式实现
yii2.0在浏览器中默认查看控制器下的方法是 http://ltbk.cn/index.php?r=login/login 要是在浏览器上输出 http://ltbk.cn/index.php/l ...
- C语言讲义——二维数组
二维数组,又称为矩形数组 可以不太准确地理解为"数组的数组" 也可以认为是一个表格 然而内存中并不是表格存储: 二维数组的初始化 第一维度可以省略 所有元素可以写在一个花括号中,计 ...
- 转载的一篇文章eclipse添加插件
eclipse没有(添加)"Dynamic Web Project"选项的方法 转载海边的第八只螃蟹 最后发布于2015-11-24 21:24:15 阅读数 40814 收藏 ...