题解-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 ...
随机推荐
- logback怎么写?分类输出日志到不同的文件
此appender有顺序,最好不要乱调顺序,输出日志如下: drwxr-xr-x 2 root root 4096 Dec 3 00:00 2019-12-02drwxr-xr-x 2 root ro ...
- rbd-mirror新功能
RBD 的 mirroring 功能将会在下一个稳定版本Jewel中实现,这个Jewel版本已经发布了第一个版本10.1.0,这个功能已经在这个发布的版本中实现了 一.基本原理 我们试图解决的或者至少 ...
- java 关于 a==null 和 null==a, a.equals("123") 和“123”.equals(a)
一: a==null 和 null==a 实验 所以 a==null 和 null==a 没区别 二: a.equals("123") 和"123".equal ...
- 基础网络路由命令(tracert、route print 、netstat )
网络知识有限,平时自己积累,捣鼓自己电脑使用,如是一样菜鸟,请勿自行在服务器端使用. 快捷键Ctrl+C 结束跟踪 快捷键 ↑ 可以查询上次输入的命令 window+R组合键,输入C ...
- 02、Spring-HelloWorld
0. 环境准备 1) jar包 jar包我会帮大家准备好的,所以不用担心找不到Jar包 链接:https://pan.baidu.com/s/1JJcYaspK07JL53vU-q-BUQ 提取码: ...
- Java中的Socket用法
转发链接:https://www.cnblogs.com/zhanglei93/p/6217384.html (1)Java中的Socket用法 Java中的Socket分为普通的Socket和Nio ...
- abp(net core)+easyui+efcore实现仓储管理系统——出库管理之六(五十五)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...
- Java(6)集合
一.Java集合框架概述 1.什么是集合 集合框架:用于存储数据的容器. 数组.集合等存储数据的结构,叫Java容器. 此时的存储,是指内存层面的存储,不涉及持久化的存储. 任何集合框架都包含三大块的 ...
- 还不懂Java高并发的,建议看看这篇阿里大佬的总结,写的非常详细
前言 进程是计算机中程序关于某几何数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位.是操作系统结构的基础 线程可以说是轻量级的进程,是程序执行的最小单位,使用多线程而不用多进程去进行并发程 ...
- Win搭建JAVA环境
一:下载JDK 下载链接:https://www.oracle.com/java/technologies/javase-downloads.html 选择你的系统环境进行下载 二:安装JDK 直接运 ...