CF1139D Steps to One

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

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

\[E(X)=\sum _{i\ge 1} P(X\ge i) \]

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

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

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

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

那么现在的式子就是:

\[1+\sum_{i\ge 2} \frac{m^{i-1}-\sum_{j=1}^m \mu(j)\lfloor\frac{m}{j}\rfloor^{i-1}}{m^{i-1}}\\ 1+\sum_{i\ge 1} \frac{m^{i}-\sum_{j=1}^m \mu(j)\lfloor\frac{m}{j}\rfloor^{i}}{m^{i}}\\ \]

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

\[1-\sum_{i\ge 1} \frac{\sum_{j=2}^m \mu(j)\lfloor\frac{m}{j}\rfloor^{i}}{m^i}\\ 1-\sum_{j=2}^m \mu(j)\sum_{i\ge 1} (\frac{\lfloor\frac{m}{j}\rfloor}{m})^i \]

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

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

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

Upt:可以通过度教筛可以做到\(O(n^{\frac{2}{3}}+\sqrt n\times \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;
}
posted @ 2020-09-03 21:16  空気力学の詩  阅读(137)  评论(0编辑  收藏  举报