好东西

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;
}
posted @ 2022-10-09 21:21  artalter  阅读(161)  评论(1编辑  收藏  举报