CF1139D Steps to One

时隔好久终于做掉了这道题

首先我们对于这种问题用常用套路分析(经典轮次期望转化套路):

[E(X)=sum _{ige 1} P(Xge i) ]

这就意味着我只要求长度大于等于(i)时的概率,而这个概率显然可以转化成长度为(i-1)(gcd e 1)的概率

考虑总方案数是(m^{i-1})容易得到,因此我们只需要求出长度为(i-1)(gcd= 1)的方案数即可

考虑使用容斥,我们枚举(gcd=j),然后真正的(gcd|j)的情况都会被计算,因此方案数是(lfloor frac{m}{j} floor ^{i-1})

然后容斥系数是什么呢,这里很显然就是莫比乌斯函数

那么现在的式子就是:

[1+sum_{ige 2} frac{m^{i-1}-sum_{j=1}^m mu(j)lfloorfrac{m}{j} floor^{i-1}}{m^{i-1}}\ 1+sum_{ige 1} frac{m^{i}-sum_{j=1}^m mu(j)lfloorfrac{m}{j} floor^{i}}{m^{i}}\ ]

(j=1)(mu(j)lfloorfrac{m}{j} floor^{i}=m^i)可以单独提出来和前面的消掉,因此现在式子:

[1-sum_{ige 1} frac{sum_{j=2}^m mu(j)lfloorfrac{m}{j} floor^{i}}{m^i}\ 1-sum_{j=2}^m mu(j)sum_{ige 1} (frac{lfloorfrac{m}{j} floor}{m})^i ]

后面的(frac{lfloorfrac{m}{j} floor}{m})显然是小于(1)的,直接套等比数列求和公式就有:

[1-sum_{j=2}^m mu(j)frac{frac{lfloorfrac{m}{j} floor}{m}}{1-frac{lfloorfrac{m}{j} floor}{m}}\ 1-sum_{j=2}^m mu(j)frac{lfloorfrac{m}{j} floor}{m-lfloorfrac{m}{j} floor} ]

然后就可以直接(O(nlog n))做了

Upt:可以通过度教筛可以做到(O(n^{frac{2}{3}}+sqrt n imes log n)),可以出一个略加强的版本

#include<cstdio>
#define RI register int
#define CI const int&
using namespace std;
const int N=100005,mod=1e9+7;
int m,prime[N],mu[N],cnt,ans; bool vis[N];
inline int quick_pow(int x,int p=mod-2,int mul=1)
{
	for (;p;p>>=1,x=1LL*x*x%mod) if (p&1) mul=1LL*mul*x%mod; return mul;
}
#define P(x) prime[x]
inline void init(CI n)
{
	RI i,j; for (vis[1]=1,i=2;i<=n;++i)
	{
		if (!vis[i]) prime[++cnt]=i,mu[i]=-1;
		for (j=1;j<=cnt&&i*P(j)<=n;++j)
		{
			vis[i*P(j)]=1; if (i%P(j)) mu[i*P(j)]=-mu[i]; else break;
		}
	}
}
#undef P
int main()
{
	RI i; for (scanf("%d",&m),init(m),ans=1,i=2;i<=m;++i)
	ans=(1LL*ans-(1LL*mu[i]*(m/i)*quick_pow(m-(m/i))%mod+mod)%mod+mod)%mod;
	return printf("%d",ans),0;
}
原文地址:https://www.cnblogs.com/cjjsb/p/13610731.html