ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

#莫比乌斯反演,期望#CF1139D Steps to One

2022-02-16 15:00:28  阅读:196  来源: 互联网

标签:lfloor right frac sum mu 反演 Steps CF1139D left


题目

每次随机选一个 \(1\) 到 \(m\) 之间的数加在数列末尾,

数列中所有数的 \(\gcd=1\) 时停止,求数列期望长度。\(m\leq 10^5\)


分析

求期望长度的一种方法就是枚举长度然后将概率相加,也即是 \(E(X)=\sum_{i=1}P(X\geq i)=1+\sum_{i=1}P(X>i)\),容斥一下

\[P(X>i)=1-\frac{[\gcd==1]}{m^i}=1-\frac{\sum_{d=1}^m\mu(d)\left\lfloor\frac{m}{d}\right\rfloor^i}{m^i}=-\frac{\sum_{d=2}^m\mu(d)\left\lfloor\frac{m}{d}\right\rfloor^i}{m^i} \]

那么

\[E(X)=1-\sum_{i=1}\sum_{d=2}^m\mu(d)\left(\frac{\left\lfloor\frac{m}{d}\right\rfloor}{m}\right)^i=1-\sum_{d=2}^m\frac{\mu(d)\left\lfloor\frac{m}{d}\right\rfloor}{m-\left\lfloor\frac{m}{d}\right\rfloor} \]

直接 \(O(m)\) 求就可以了


代码

#include <cstdio>
#define rr register
using namespace std;
const int mod=1e9+7,N=100011;
int n,mu[N],prime[N],inv[N],cnt,ans; bool v[N];
signed main(){
	scanf("%d",&n),mu[1]=inv[1]=inv[0]=ans=1;
	for (rr int i=2;i<=n;++i){
		inv[i]=1ll*inv[mod%i]*(mod-mod/i)%mod;
		if (!v[i]) mu[i]=-1,prime[++cnt]=i;
		for (rr int j=1;j<=cnt&&i<=n/prime[j];++j){
			v[i*prime[j]]=1;
			if (i%prime[j]==0) break;
			mu[i*prime[j]]=-mu[i];
		}
	}
	for (rr int i=2;i<=n;++i)
	    ans=(ans-1ll*mu[i]*(n/i)*inv[n-n/i]%mod)%mod;
	return !printf("%d",(ans+mod)%mod);
}

标签:lfloor,right,frac,sum,mu,反演,Steps,CF1139D,left
来源: https://www.cnblogs.com/Spare-No-Effort/p/15900575.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有