题目链接

啊啊啊我在干什么啊。怎么这么颓一道题做这么久。。

又记错莫比乌斯反演式子了(╯‵□′)╯︵┻━┻


\(Description\)

给定\(n\)。有一个初始为空的集合\(S\)。令\(g\)表示S中所有数的\(\gcd\)。每次随机选择一个\([1,n]\)中的数加到集合\(S\)中去,直到\(g=1\)。求集合\(S\)的期望大小。(原题目描述为数列长度,\(n\)是指\(m\),我自己都看混了=-=)

\(n\leq10^5\)。

\(Solution\)

首先不要想\(f[i][j]\)这种奇奇怪怪的二维DP状态。。

令\(f[x]\)表示\(g=x\)时集合的期望大小。那么有$$\begin{aligned}f[x]&=1+\frac1n\sum_{i=1}^nf[\gcd(i,x)]\&=1+\frac1n\sum_{d\mid x}f[d]\sum_{i=1}^n[(i,x)=d]\&=1+\frac1n\sum_{d\mid x}f[d]\sum_{i=1}^{\lfloor\frac nd\rfloor}[(i,\lfloor\frac xd\rfloor)=1]\end{aligned}$$

问题在于求\(\sum_{i=1}^{\lfloor\frac nd\rfloor}[(i,\lfloor\frac xd\rfloor)=1]\)。不妨设\(g(n,k)=\sum_{i=1}^n[(i,k)=1]\)。

若限制不是\([(i,k)=1]\)而是\([x\mid (i,k)]\),显然答案就是\([x\mid k]\lfloor\frac nx\rfloor\)。

所以令\(f(d)=\sum_{i=1}^n[(i,k)=d]\),\(F(d)=\sum_{i=1}^n[d\mid(i,k)]=[d\mid k]\lfloor\frac nd\rfloor\),有$$\begin{aligned}g(n,k)=f(1)&=\sum_{i=1}n\mu(i)F(i)\&=\sum_{i=1}n\mu(i)[i\mid k]\lfloor\frac ni\rfloor\&=\sum_{d\mid k}\mu(d)\lfloor\frac nd\rfloor\end{aligned}$$

那么直接这样计算一次\(g(n,k)\)的复杂度是\(O(约数个数)\)的。\(1\sim n\)的约数个数均摊应该是\(O(\log n)\)的?

发现转移的时候两边都有\(f[x]\)。移下项,$$(1-\frac1n\sum_{i=1}^{\lfloor\frac nx\rfloor}[(i,1)=1])f[x]=1+\frac1n\sum_{d\mid x,d\neq x}f[d]\sum_{i=1}^{\lfloor\frac nd\rfloor}[(i,\lfloor\frac xd\rfloor)=1]\f[x]=\frac{1+\frac1n\sum_{d\mid x,d\neq x}f[d]\sum_{i=1}^{\lfloor\frac nd\rfloor}[(i,\lfloor\frac xd\rfloor)=1]}{1-\frac1n\lfloor\frac nx\rfloor}=\frac{n+\sum_{d\mid x,d\neq x}f[d]\sum_{i=1}^{\lfloor\frac nd\rfloor}[(i,\lfloor\frac xd\rfloor)=1]}{n-\lfloor\frac nx\rfloor}$$

这样就可以啦。答案是\(\sum_{i=1}^n\frac1nf[i]\)。

复杂度大概是\(O(n\log^2n)\)的?

还有其它更优的做法,不想看惹(甚至有线性的,瑟瑟发抖)。


//140ms	10900KB
#include <cstdio>
#include <vector>
#include <algorithm>
#define mod 1000000007
typedef long long LL;
const int N=1e5+5; int P[N>>2],mu[N],f[N],inv[N];
bool notP[N];
std::vector<int> fac[N]; inline int FP(int x,int k)
{
int t=1;
for(; k; k>>=1,x=1ll*x*x%mod) k&1&&(t=1ll*t*x%mod);
return t;
}
inline int G(int n,int k)
{
LL ans=0;
for(int i=0,l=fac[k].size(); i<l; ++i) ans+=mu[fac[k][i]]*(n/fac[k][i]);
return ans%mod;
}
void Init(const int n)
{
mu[1]=1;
for(int i=2,cnt=0; i<=n; ++i)
{
if(!notP[i]) P[++cnt]=i, mu[i]=-1;
for(int j=1,v; j<=cnt&&(v=i*P[j])<=n; ++j)
{
notP[v]=1;
if(i%P[j]) mu[v]=-mu[i];
else break;
}
}
for(int i=1; i<=n; ++i)
for(int j=i; j<=n; j+=i) fac[j].push_back(i);
} int main()
{
int n; scanf("%d",&n);
Init(n);
f[1]=1, inv[1]=1;
for(int i=2; i<=n; ++i) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
for(int x=2; x<=n; ++x)
{
LL tmp=n;
const std::vector<int> &v=fac[x];
for(int i=0,l=v.size(),d; i+1<l; ++i) d=v[i], tmp+=1ll*f[d]*G(n/d,x/d);
f[x]=tmp%mod*inv[n-n/x]%mod;
}
LL ans=0;
for(int i=1; i<=n; ++i) ans+=f[i];
printf("%d\n",int(ans%mod*inv[n]%mod)); return 0;
}

Codeforces.1139D.Steps to One(DP 莫比乌斯反演)的更多相关文章

  1. Codeforces 1139D Steps to One dp

    Steps to One 啊, 我要死了, 这种垃圾题居然没写出来, 最后十分钟才发现错在哪. 不知道为什么我以为 对于一个数x , 除了它的因子和它的倍数都是和它互质的, 我脑子是抽了吗? 随便瞎d ...

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

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

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

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

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

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

  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. 【Codeforces 809E】Surprise me!(莫比乌斯反演 & 虚树)

    Description 给定一颗 \(n\) 个顶点的树,顶点 \(i\) 的权值为 \(a_i\).求: \[\frac{1}{n(n-1)}\sum_{i=1}^n\sum_{j=1}^n\var ...

  7. 【CodeForces】915 G. Coprime Arrays 莫比乌斯反演,前缀和,差分

    Coprime Arrays CodeForces - 915G Let's call an array a of size n coprime iff gcd(a1, a2, ..., *a**n) ...

  8. 【CodeForces】915 G. Coprime Arrays 莫比乌斯反演

    [题目]G. Coprime Arrays [题意]当含n个数字的数组的总gcd=1时认为这个数组互质.给定n和k,求所有sum(i),i=1~k,其中sum(i)为n个数字的数组,每个数字均< ...

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

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

随机推荐

  1. BZOJ3864: Hero meet devil(dp套dp)

    Time Limit: 8 Sec  Memory Limit: 128 MBSubmit: 397  Solved: 206[Submit][Status][Discuss] Description ...

  2. Atcoder Tenka1 Programmer Contest 2019

    C 签到题,f[i][0/1]表示以i结尾最后一个为白/黑的最小值,转移显然. #include<bits/stdc++.h> using namespace std; ; ]; char ...

  3. 一张图认识Python(附基本语法总结)

    一张图带你了解Python,更快入门, Python基础语法总结: 1.Python标识符 在 Python 里,标识符有字母.数字.下划线组成. 在 Python 中,所有标识符可以包括英文.数字以 ...

  4. MTD下的Nand驱动

    目录 MTD下的Nand驱动 引入 平台设备资源文件 关键数据结构 平台框架 s3c24xx_nand_probe nand_scan s3c2410_nand_add_partition add_m ...

  5. Docker:单机编排工具docker-compose [十二]

    一.docker-compose的安装 1.安装 curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.re ...

  6. day18 集合框架(JCF)

    集合框架(JCF)java collections framework 框架:为了实现某一目的/功能而预先提供的一系列封装好的具有继承或实现关系的类与接口. 1.这种框架是高性能的,对基本类集(动态数 ...

  7. 第六节:WebApi的部署方式(自托管)

    一. 简单说明 开篇就介绍过WebApi和MVC相比,其中优势之一就是WebApi可以不依赖于IIS部署,可以自托管,当然这里指的是 .Net FrameWork 下的 WebApi 和 MVC 相比 ...

  8. 第十五节:Expression表达式目录树(与委托的区别、自行拼接、总结几类实例间的拷贝)

    一. 基本介绍 回忆: 最早接触到表达式目录树(Expression)可能要追溯到几年前使用EF早期的时候,发现where方法里的参数是Expression<Func<T,bool> ...

  9. 多人聊天室(Java)

    第1部分 TCP和UDP TCP:是一种可靠地传输协议,是把消息按一个个小包传递并确认消息接收成功和正确才发送下一个包,速度相对于UDP慢,但是信息准确安全:常用于一般不要求速度和需要准确发送消息的场 ...

  10. 引用变量&和指针*的区别

    &在C/C++中做右值时,为取地址运算符,来指示变量的地址.C++给&符号赋予了另外一个含义,将其用来声明引用. 引用变量的作用: 1.别名 int b = 0; int& a ...