好东西
CF1139D Steps to One
给一个数列,每次随机选一个 1 到 m 之间的数加在数列末尾,数列中所有数的 gcd=1 时停止,求期望长度。
\[\begin{aligned}
E(len) &= \sum_iP(len=i)i\\
&= \sum_{i}P(len=i)\sum_{j=1}^i\\
&=\sum_j\sum_{i>=j}P(len=i)\\
&=\sum_jP(len \ge j)\\
&=\sum_j{P(len>j-1)}\\
&=\sum_{j=0}{P(len>j-1)}+\sum_{j\ge 1}{P(len>j-1)}\\
&=1+\sum_{j}{P(len>j)}\\
P(len>n)&=1-\frac{\sum [gcd(a_1,a_2,a_3,\cdots,a_n)!=1]}{m^n} \\
&=1-\frac{\sum[gcd(a_1,a_2,a_3,\cdots,a_n)=1]}{m^n}\\
&=1-\frac{\sum \mu(d)\sum_d[d|gcd({a_1}{},{a_2}{},{a_3}{},\cdots,{a_n}{})]}{m^n}\\
&=1-\frac{\sum_{d=1}^m \mu(d) \sum[d|gcd({a_1}{},{a_2}{},{a_3}{},\cdots,{a_n}{})]}{m^n}\\
&=1-\frac{\sum_{d=1}^m \mu(d) (\lfloor \frac{m}{d} \rfloor)^n}{m^n}\\
&=-\frac{\sum_{d=2}^m \mu(d) (\lfloor \frac{m}{d} \rfloor)^n}{m^n}\\
E(len) &=1+\sum_{j}{P(len>j)}\\
&=1-\sum_{j}{\frac{\sum_{d=2}^m \mu(d) (\lfloor \frac{m}{d} \rfloor)^j}{m^j}}\\
&=1-\sum_{d=2}^m \mu(d) \sum_{j}{(\frac{\lfloor \frac{m}{d} \rfloor}{m}})^j\\
&=1-\sum_{d=2}^m \mu(d) \frac{1}{1-{\frac{\lfloor \frac{m}{d} \rfloor}{m}}}\\
&=1-\sum_{d=2}^m \mu(d) \frac{m}{m-{\lfloor \frac{m}{d} \rfloor}}\\
\end{aligned}
\]
式子化到这一步就可以直接做了。
已然遥远的理想之城
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const LL P=1e9+7;
const int maxn = 1000005;
int prime[maxn],mu[maxn],cnt;
bool vis[maxn];
void init(int n)
{
vis[1]=mu[1]=1;
for(int i=2;i<=n;i++)
{
if(!vis[i])
{
prime[++cnt]=i;
mu[i]=-1;
}
for(int j=1;i*prime[j]<=n;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j])mu[i*prime[j]]=-mu[i];
else break;
}
}
}
LL fsp(int a,int b=P-2)
{
LL s=1;
while(b)
{
if(b&1)s=s*a%P;
b>>=1;
a=1ll*a*a%P;
}
return s;
}
int main()
{
int m;
cin>>m;
init(100000);
LL sum=0;
for(int i=2;i<=m;i++)
{
int k=m/i;
(sum+=(1ll*mu[i]*k*fsp(m-k)%P+P)%P)%=P;
}
sum=(1-sum+P)%P;
cout<<sum;
return 0;
}