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; } } } }