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;
}
辣鸡老年选手AFO在即