洛谷——P2158 [SDOI2008]仪仗队

P2158 [SDOI2008]仪仗队

找规律大水题嘛,如果你做过P1170 兔八哥与猎人

这题得到的规律是$a,b,c,d$,若$gcd(a-b,c-d)==1$ 那么$a,b$就能看到$c,d$

显然这题暴力枚举$O(n^2)$是过去的,然后有了规律,那么这题也就是要求$sum_{i=1}^{n} varphi i$

据说线性筛可以筛欧拉函数,来瞧一瞧

首先根据欧拉函数通式$varphi(x)=xprodlimits_{i=1}^{n}{(1-frac{1}{p_i})}$

其中$p_1, p_2……p_n$为$x$的所有质因数,$x$是不为0的整数。

埃式筛法:

for(int i=1;i<=n;i++) 
        ph[i]=i;
    for(int i=2;i<=n;i++){
        if(ph[i]==i)
            for(int j=i;j<=n;j+=i)
                ph[j]=ph[j]/i*(i-1);
    }

几个重要的性质

1.$varphi(1) =1$

2.$n$是质数,$varphi (n)= n-1$

3.欧拉函数是积性函数,所以当$a,b$互质时,$varphi (a imes b) = varphi (a) imes varphi(b) $

4.当$p$为质数时,$varphi (p^k)=p^k -p^{k-1} =(p-1)*p^{k-1}$因为除$p$的倍数外,其他数都跟$n$互质。

5.当$n$为奇数时,$varphi (2n)=varphi (n)$,证明与上述类似。

6.当$n>2$时,$varphi (n)$都是偶数;

欧拉筛法(线性筛法):

void OULA(){
    for(int i=2;i<=N;i++){
        if(!vis[i]) {
            prime[++tot]=i;
            ph[i]=i-1;
        }
        for(int j=1;j<=tot&&i*prime[j]<=N;j++){
            vis[prime[j]*i]=1;
            if(i%prime[j]) ph[prime[j]*i]=(prime[j]-1)*ph[i];
            else {
                ph[prime[j]*i]=ph[i]*prime[j];
                break;
            }
        }
    }
}
原文地址:https://www.cnblogs.com/song-/p/9804522.html