【积性函数专练】洛谷 P2158 [SDOI2008] 仪仗队

洛谷 P2158 [SDOI2008] 仪仗队

image
image

思路:套莫反

image

点击查看代码
int mo[N];
int cnt,primes[N];bool st[N];
ll sum[N];
void init(){
    mo[1] = 1;
    for(int i=2;i<N;i++){
        if(!st[i]) primes[cnt++] = i,mo[i] = -1;
        for(int j=0;primes[j]*i<N;j++){
            st[primes[j]*i] = 1;
            if(i%primes[j] == 0) break;
            mo[primes[j]*i] = -mo[i];
        }
    }
    for(int i=1;i<N;i++) sum[i] = sum[i-1] + mo[i];
}
int g(int n,int x){
    return n/(n/x);
}
int main(){
    init();
    int n;
    cin>>n;
    if(n==1){cout<<0<<endl;return 0;}
    ll res =0;
    for(int l = 1,r; l <= n-1 ;l = r + 1){
        r = min(n,g(n-1,l));
        res+=(ll)(sum[r]-sum[l-1])*((n-1)/l)*((n-1)/l);
    }
    cout<<res+2<<endl;
    return 0;
}
posted @ 2021-10-03 11:31  qingyanng  阅读(31)  评论(1编辑  收藏  举报