题目链接

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

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


\(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. elastalert

    http://blog.51cto.com/kexiaoke/1977481 什么是? ElastAlert是一个简单的框架,用于从弹性搜索中的数据中提取异常,尖峰或其他感兴趣的模式.在Yelp,我们 ...

  2. EOJ 306 树上问题

    题解: 因为w大于1,所以,题意就是,有多少(x,z),存在x到z的路径上,有一个x<y<z的y w没用的其实. 树上路径问题,有什么方法吗? 1.树链剖分.这个主要方便处理修改操作. 2 ...

  3. Redis系列八:redis主从复制和哨兵

    一.Redis主从复制 主从复制:主节点负责写数据,从节点负责读数据,主节点定期把数据同步到从节点保证数据的一致性 1. 主从复制的相关操作 a,配置主从复制方式一.新增redis6380.conf, ...

  4. Python之False和None

    这个其实在Python文档当中有写了,为了准确起见,我们先引用Python文档当中的原文: In the context of Boolean operations, and also when ex ...

  5. oldboy s21day11

    #!/usr/bin/env python# -*- coding:utf-8 -*- # 1.列举 str.list.dict.set 中的常用方法(每种至少5个),并标注是否有返回值.'''str ...

  6. 【转载】VS中生成、清理项目、调试、开始执行(不调试)、Debug 和 Release等之间的区别

    https://blog.csdn.net/u012441545/article/details/51404412

  7. densenet 中的shortcut connection

    DenseNet  在FCN 网络中考虑加入skip connection,在resnet 中加入identity 映射,这些 shortcut connection等结构能够得到更好的检测效果,在d ...

  8. Jenkins--发送邮件配置

    使用Jenkins可以进行构建,并可以发送邮件.今天我们来讲一下邮件的配置. 首先:下载安装插件: 进入[Jenkins-系统管理-插件管理-可选插件],搜索“Email Extension”进行安装 ...

  9. codeblocks修改字体颜色-背景颜色

    常用: 1. 编辑器背景-豆沙绿配置:色调85,饱和度123,亮度205: 2. 注释颜色-紫色:rgb(255,0,255): 参考: 改变codeblocks里面各种注释的颜色 常用颜色的RGB值 ...

  10. 【洛谷P1706全排列问题】

    题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 代码如下: #include<iostream>#include<cstd ...