【bzoj 2818】Gcd(欧拉函数)
2018-01-16 16:35
253 查看
传送门biu~
求欧拉函数的前缀和sumi=∑ij=1φjsumi=∑j=1iφj。
假设gcd(x,y)=pgcd(x,y)=p(pp为素数),那么gcd(xp,yp)=1gcd(xp,yp)=1。所以枚举素数pp,[ 1,⌊np⌋ ][ 1,⌊np⌋ ]之间互素的元素对数即为2×sum⌊np⌋−12×sum⌊np⌋−1(减去x=yx=y的情况)。
求欧拉函数的前缀和sumi=∑ij=1φjsumi=∑j=1iφj。
假设gcd(x,y)=pgcd(x,y)=p(pp为素数),那么gcd(xp,yp)=1gcd(xp,yp)=1。所以枚举素数pp,[ 1,⌊np⌋ ][ 1,⌊np⌋ ]之间互素的元素对数即为2×sum⌊np⌋−12×sum⌊np⌋−1(减去x=yx=y的情况)。
#include<bits/stdc++.h> using namespace std; int n,prime[10000005],phi[10000005],tp; long long sum[10000005]; bool b[10000005]; long long ans; inline void getprime(){ phi[1]=1; for(int i=2;i<=n;++i){ if(!b[i]) prime[++tp]=i,phi[i]=i-1; for(int j=1;j<=tp && 1ll*i*prime[j]<=n;++j){ b[i*prime[j]]=true; if(i%prime[j]==0){ phi[i*prime[j]]=phi[i]*prime[j]; break; } else phi[i*prime[j]]=phi[i]*(prime[j]-1); } } } int main(){ scanf("%d",&n); getprime(); for(int i=1;i<=n;++i) sum[i]=sum[i-1]+phi[i]; for(int i=1;i<=tp;++i) ans+=2ll*sum[n/prime[i]]-1; printf("%lld",ans); return 0; }
相关文章推荐
- BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】
- 【bzoj2818】Gcd 欧拉函数
- BZOJ 2818: Gcd( 欧拉函数 )
- bzoj2818 Gcd(欧拉函数前缀和)
- BZOJ 2818 GCD【欧拉函数】
- bzoj2818: Gcd(欧拉函数)
- BZOJ-2818-Gcd(欧拉函数/Mobius反演)
- [bzoj2818]Gcd 欧拉函数
- 【BZOJ2818】Gcd(莫比乌斯反演,欧拉函数)
- 【欧拉函数】BZOJ2818-GCD
- [BZOJ 2818] Gcd 线性筛+欧拉函数前缀和
- bzoj 2818 GCD(欧拉函数)
- 【BZOJ2818】Gcd (欧拉函数)
- 【数论】【筛法求素数】【欧拉函数】bzoj2818 Gcd
- [BZOJ 2818] gcd · 欧拉函数
- 【bzoj2818】Gcd 欧拉函数
- bzoj 2818 Gcd 欧拉函数
- 【欧拉函数+线性筛】bzoj2818: Gcd
- bzoj 2818 Gcd 欧拉函数求和
- BZOJ2818: Gcd 欧拉函数求前缀和