题面

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\) 事件的概率)。

\[\begin{split}
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\) 就结束了,所以:

\[\begin{split}
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\) 抵消掉。

带回上式:

\[\begin{split}
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)}\) 是无穷等比数列求值:

\[s=x+x^2+x^3+\cdots\\
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的更多相关文章

  1. CF1139D Steps to One 题解【莫比乌斯反演】【枚举】【DP】

    反演套 DP 的好题(不用反演貌似也能做 Description Vivek initially has an empty array \(a\) and some integer constant ...

  2. CF1139D Steps to One

    题目链接:洛谷 这个公式可真是个好东西.(哪位大佬知道它叫什么名字的?) 如果$X$恒$\geq 0$,那么 $$E[X]=\int_0^{+\infty}P(X>t)dt$$ 呸,我什么都没写 ...

  3. cf1139D. Steps to One(dp)

    题意 题目链接 从\([1, M]\)中随机选数,问使得所有数gcd=1的期望步数 Sol 一个很显然的思路是设\(f[i]\)表示当前数为\(i\),期望的操作轮数,转移的时候直接枚举gcd \(f ...

  4. CF1139D Steps to One(DP,莫比乌斯反演,质因数分解)

    stm这是div2的D题……我要对不住我这个紫名了…… 题目链接:CF原网  洛谷 题目大意:有个一开始为空的序列.每次操作会往序列最后加一个 $1$ 到 $m$ 的随机整数.当整个序列的 $\gcd ...

  5. CF1139D Steps to One (莫比乌斯反演 期望dp)

    \[ f[1] = 0 \] \[ f[i] = 1 + \frac{1}{m} \sum_{j = 1} ^ n f[gcd(i, j)] \ \ \ \ \ \ (i != 1) \] 然后发现后 ...

  6. 【期望dp 质因数分解】cf1139D. Steps to One

    有一种组合方向的考虑有没有dalao肯高抬啊? 题目大意 有一个初始为空的数组$a$,按照以下的流程进行操作: 在$1\cdots m$中等概率选出一个数$x$并添加到$a$的末尾 如果$a$中所有元 ...

  7. 【CF1139D】Steps to One(动态规划)

    [CF1139D]Steps to One(动态规划) 题面 CF 你有一个数组,每次随机加入一个\([1,n]\)的数,当所有数\(gcd\)为\(1\)时停止,求数组长度的期望. 题解 设\(f[ ...

  8. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  9. 【题解】【数组】【查找】【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 ...

随机推荐

  1. JS之DOM(一)

    一.DOM简介 什么是DOM?简单地说,DOM是是针对HTML和XML文档的一个API,一套对文档的内容进行抽象和概念化的方法. 学习过ORM的同学可能知道ORM是将数据库中的表映射到类,建立一个表和 ...

  2. create-react-app添加对TypeScript支持

    背景 最近一直在重构react项目,由于项目历史原因,将之前parcel打包工具换成了webpack,并选择了使用create-react-app作为项目开发脚手架. 接着就是把项目中flow类型检查 ...

  3. synchronized 到底该不该用?

    我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...

  4. 01、Spring环境搭建

    环境:SpringSource-Tool-3.9.9.Eclipse4.10.0 首先,我们需要解决的是Spring包的问题,我看了百度.CSDN很多都是直接一上来随便丢个包就可以安装了,搞得我弄了一 ...

  5. 光棍节程序员闯关秀writeup

    答题链接https://1111.segmentfault.com/ 第一关 首先当然是右键查看源码啊 点击链接进入下一关 第二关 还是老样子,右键查看源码 这个key是要放在URL链接里敲回车的 第 ...

  6. 记一次容器内执行ansible命令卡住

    1.由来 最近在使用kylin_v10系统,发现当在此系统下运行的容器内执行#ansible localhost -m setup 命令会卡住不动,于是和同事一起经过如下排查最终找到解决问题的办法. ...

  7. 3dmax利用静止静态对象功能,制作精准击碎效果

    一般情况下,当我们在3D建模中使用RayFire破碎插件来制作一些精准击碎效果时,需要将物体的击中部分定义为休眠对象,将其他未击中的部分定义为静态对象,以实现击中部分出现碎片的效果.但这种方式必须精准 ...

  8. BT下载器Folx中删除任务与删除文件的功能区别

    当用户使用Folx完成了任务下载后,该任务仍会保留在下载列表中,并标注"已结束"的标记.随着使用时间的增长,Folx下载列表中会包含过多的"已结束"任务,用户需 ...

  9. FL studio系列教程(十四):如何在FL Studio播放列表中排列样式

    我们在FL Studio中做好了节奏样式后就可以在播放列表窗口中进行乐曲的编排了.刚接触这款软件的同学肯定会对如何编排比较陌生但也比较憧憬的,因为它是从一个窗口到另一个窗口中的操作.其实明白了这里的知 ...

  10. 思维导图iMindMap怎么做大型项目管理

    在大型企业中,有许多大型而复杂的项目,你要考虑内外部因素.期限以及你要达成的目标等等,所以我们要进行项目管理.下面小编教你怎么用iMindMap思维导图进行项目管理. iMindMap有一个工作区,以 ...