stm这是div2的D题……我要对不住我这个紫名了……

题目链接:CF原网  洛谷

题目大意:有个一开始为空的序列。每次操作会往序列最后加一个 $1$ 到 $m$ 的随机整数。当整个序列的 $\gcd$ 为 $1$ 时停止。问这个序列的期望长度对 $10^9+7$ 取模的值。

$1\le m\le 10^5$。


首先很容易想到DP:$f_i$ 表示目前的 $\gcd$ 为 $i$,期望还要多少次才能结束。

那么有 $f_1=0$。

转移,直接枚举即可:$f_i=1+\dfrac{1}{m}\sum\limits^m_{j=1}f_{\gcd(i,j)}$。

如果出现 $\gcd(i,j)=i$(也就是 $i|j$),那么把这种情况特殊判断,那么解个方程可以得到:

$$f_i=\dfrac{1+\dfrac{1}{m}\sum\limits^m_{j=1,i\nmid j}f_{\gcd(i,j)}}{1-\lfloor\frac{m}{i}\rfloor}$$

答案为 $\dfrac{1}{m}\sum\limits^m_{i=1}(f_i+1)$。

这是 $O(m^2\log m)$ 的。我当时就是在这里卡住了,现在感觉自己是个zz……

我们套路地枚举 $\gcd$,设 $c(i,j)$ 表示有多少个 $1\le x\le m$ 满足 $\gcd(i,x)=j$。那么就有:

$$f_i=\dfrac{1+\dfrac{1}{m}\sum\limits_{j|i}f_{j}c(i,j)}{1-\lfloor\frac{m}{i}\rfloor}$$

接下来就要考虑求 $c(i,j)(j|i)$。

$$c(i,j)=\sum\limits^m_{x=1}[\gcd(i,x)=j]$$

$$c(i,j)=\sum\limits^m_{j|x}[\gcd(\frac{i}{j},\frac{x}{j})=1]$$

$$c(i,j)=\sum\limits^{\lfloor\frac{m}{j}\rfloor}_{x=1}[\gcd(\frac{i}{j},x)=1]$$

接下来有两条路可走:分解质因数(官方做法)和莫比乌斯反演(大众做法)。

那我们先来看看大众做法。


莫比乌斯反演:

$$c(i,j)=\sum\limits^{\lfloor\frac{m}{j}\rfloor}_{x=1}\sum\limits_{d|\gcd(\frac{i}{j},x)}\mu(d)$$

$$c(i,j)=\sum\limits_{d|\frac{i}{j}}\mu(d)\sum\limits^{\lfloor\frac{m}{j}\rfloor}_{d|x}1$$

$$c(i,j)=\sum\limits_{d|\frac{i}{j}}\mu(d)\lfloor\dfrac{m}{jd}\rfloor$$

此时求 $c(i,j)$ 复杂度为 $O(\sqrt{\frac{i}{j}})$。

总复杂度为 $O(\sum\limits^m_{i=2}\sum\limits_{j|i}\sqrt{\frac{i}{j}})=O(\sum\limits^m_{i=2}\sum\limits_{j|i}\sqrt{j})=O(\sum\limits^m_{j=1}\sqrt{j}\lfloor\frac{m}{j}\rfloor)\approx O(m\int^m_1j^{-\frac{1}{2}}\mathrm{d}j)=O(m\sqrt{m})$。


分解质因数:

我们不妨修改一下定义(只是为了方便):令 $c(x,y)=\sum\limits^y_{i=1}[\gcd(i,x)=1]$。那么原来的 $c(i,j)$ 就变成了现在的 $c(\frac{i}{j},\lfloor\frac{m}{j}\rfloor)$。

也就是要 $i$ 和 $x$ 的质因子集合没有交集。

我们从反向考虑,考虑与 $x$ 的质因子有交集的 $i$ 的个数。

先对 $x$ 质因数分解,设分解出的不同质因子有 $p_1,p_2\cdots p_k$。那么有 $k\le 6$。

那么与集合 $S$ 有交的 $i$ 的个数就是 $\lfloor\frac{y}{\prod S_i}\rfloor$。

然后还要再容斥一下。那么总的就是:

$$c(x,y)=y-\sum\limits_{S\in x_{pr},S\ne\varnothing}(-1)^{|S|+1}\lfloor\frac{y}{\prod S_i}\rfloor$$

当然也可以写成:(这是代码中的写法)

$$c(x,y)=\sum\limits_{S\in x_{pr}}(-1)^{|S|}\lfloor\frac{y}{\prod S_i}\rfloor$$

此时转移方程为:

$$f_i=\dfrac{1+\dfrac{1}{m}\sum\limits_{j|i}f_{j}c(\frac{i}{j},\lfloor\frac{m}{j}\rfloor)}{1-\lfloor\frac{m}{i}\rfloor}$$

这个可以做到 $O(2^k+\sqrt{x})$。注意最好用DFS,不要用二进制枚举,否则会退化为 $O(2^k\times k+\sqrt{x})$。(虽然也能过)

时间复杂度也是 $O(m\sqrt{m})$。


由于大多数人写的都是莫比乌斯反演,我就写一发质因数分解给大家。

#include<bits/stdc++.h>
using namespace std;
const int maxn=,mod=;
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
char ch=getchar();int x=,f=;
while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f?-x:x;
}
int m,f[maxn],fac[],fl;
inline int qpow(int a,int b){
int ans=;
for(;b;b>>=,a=1ll*a*a%mod) if(b&) ans=1ll*ans*a%mod;
return ans;
}
int dfs(int dep,int pro,int sgn,int up){ //dep表示正在枚举第几个质因子,pro表示S的乘积,sgn表示容斥系数(1或-1),up表示上界
if(dep>fl) return up/pro*sgn;
else return dfs(dep+,pro,sgn,up)+dfs(dep+,pro*fac[dep],-sgn,up);
}
int cnt(int x,int y){
fl=;
for(int i=;i*i<=x;i++)
if(x%i==){
fac[++fl]=i;
while(x%i==) x/=i;
}
if(x>) fac[++fl]=x;
return dfs(,,,y);
}
int main(){
m=read();int inv=qpow(m,mod-);
f[]=;
FOR(i,,m){
if(i!=){ //最后要除以m,加1再除以1-m/i
f[i]=1ll*f[i]*inv%mod;
f[i]=(f[i]+)%mod;
f[i]=1ll*f[i]*qpow((-1ll*(m/i)*inv%mod+mod)%mod,mod-)%mod;
}
FOR(j,,m/i) f[i*j]=(f[i*j]+1ll*f[i]*cnt(j,m/i))%mod;
//枚举i的倍数,f[i*j]+=f[i]*c((i*j)/i,m/i)
}
int ans=;
FOR(i,,m) ans=(ans+f[i]+)%mod; //累加答案
ans=1ll*ans*inv%mod;
printf("%d\n",ans);
}

CF1139D Steps to One(DP,莫比乌斯反演,质因数分解)的更多相关文章

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

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

  2. Codeforces.1139D.Steps to One(DP 莫比乌斯反演)

    题目链接 啊啊啊我在干什么啊.怎么这么颓一道题做这么久.. 又记错莫比乌斯反演式子了(╯‵□′)╯︵┻━┻ \(Description\) 给定\(n\).有一个初始为空的集合\(S\).令\(g\) ...

  3. Steps to One DP+莫比乌斯反演

    卧槽,这么秀吗??? 暂时留坑...

  4. T^TOJ - 2360 - Home_W的超级数学题 - 莫比乌斯反演 - 质因数分解

    求单个莫比乌斯函数忘记算n本身的质数,WA了一发. http://www.fjutacm.com/Problem.jsp?pid=2360 首先,显然随着n增大,与m互质的数不会变少.可以二分来求k, ...

  5. Codeforces - 1139D - Steps to One (概率DP+莫比乌斯反演)

    蒟蒻数学渣呀,根本不会做. 解法是参考 https://blog.csdn.net/xs18952904/article/details/88785210 这位大佬的. 状态的设计和转移如上面博客一样 ...

  6. codeforces#1139D. Steps to One (概率dp+莫比乌斯反演)

    题目链接: http://codeforces.com/contest/1139/problem/D 题意: 在$1$到$m$中选择一个数,加入到一个初始为空的序列中,当序列的$gcd$和为$1$时, ...

  7. cf1139D. Steps to One(dp)

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

  8. Codeforces Round #548 (Div. 2) D 期望dp + 莫比乌斯反演

    https://codeforces.com/contest/1139/problem/D 题意 每次从1,m中选一个数加入队列,假如队列的gcd==1停止,问队列长度的期望 题解 概率正着推,期望反 ...

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

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

随机推荐

  1. java的数据类型:基本数据类型和引用数据类型

    Java数据类型的基本概念 数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式. 开始接触每种语言的时候,都会存在对数据类型的认识,有复杂的,有复杂的,各 ...

  2. Mac上通过iterm 上传文件到服务器

    .安装 brew install lrzsz #这里以homebrew方式安装12.脚本 拉取 https://github.com/mmastrac/iterm2-zmodem 两个sh文件,将他们 ...

  3. class用法

    自 PHP 5.5 起,关键词 class 也可用于类名的解析.使用 ClassName::class 你可以获取一个字符串,包含了类 ClassName 的完全限定名称.这对使用了 命名空间 的类尤 ...

  4. Spring是如何校验XML的

    首先来看下xml的一些概念: xml的schema里有namespace,可以给它起个别名.比如常见的spring的namespace: xmlns:mvc="http://www.spri ...

  5. php5.6.x到php7.0.x特性

    php5.6.x到php7.0.x特性 1.标量类型声明 字符串(string), 整数 (int), 浮点数 (float), 布尔值 (bool),callable,array,self,Clas ...

  6. django rest framework批量上传图片及导入字段

    一.项目需求 批量上传图片,然后批量导入(使用excel)每个图片对应的属性(属性共十个,即对应十个字段,其中外键三个). 二.问题 一次可能上传成百上千张图片和对应字段,原来数据库的设计我将图片和对 ...

  7. 原型链上的call方法集合

    1. Object.prototype.toString.call(value) // 返回数据的类型 // "[object Object]" 等 2. Array.protot ...

  8. nginx反向代理(动静分离)

    使用反向代理(动静分离)可以让nginx专注静态内容,把动态请求交给apache来处理,发挥各自的优势,而且整个架构更加清晰: 这里假设你已经搭建好了nginx环境; 为了简单起见,就不用源码编译安装 ...

  9. Microsoft Bot Framework with LUIS

    今年微软的编程之美的主题是“对话即平台”,“人工智能”,要求参赛选手用到Bot Framework与Cognitive Services. 大多数人应该对这两个技术都不怎么熟悉吧,我就在这里写写自己所 ...

  10. hdu 5652(并查集)

    题意:很久之前,在中国和印度之间有通路,通路可以简化为一个n*m的字符串,0表示能通过,1表示障碍,每过一年就有一个坐标变成1,问你什么时候,通路彻底无法通过: 解题思路:无向图的连通性,一般直接搜索 ...