[BZOJ2818]Gcd
2018-02-23 18:57
232 查看
题目大意:
对于给定的$n(n\leq10^7)$,求$\displaystyle\sum_{x=1}^n\sum_{y=1}^n[\gcd(x,y)为质数]$。
思路:
$\displaystyle\begin{align*}原式&=\sum_{p为质数且p\leq n}\sum_{a=1}^{\lfloor\frac{n}{p}\rfloor}\sum_{b=1}^{\lfloor\frac{n}{p}\rfloor}[\gcd(a,b)=1]\\&=2(\sum_{p为质数且p\leq n}\sum_{a=1}^{\lfloor\frac{n}{p}\rfloor}\varphi(a))-小于等于n的质数个数\end{align*}$
因此可以先线性筛求出欧拉函数,然后求前缀和,最后枚举$p$即可。
#include<cstdio> #include<cctype> typedef long long int64; inline int getint() { register char ch; while(!isdigit(ch=getchar())); register int x=ch^'0'; while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); return x; } const int N=10000001,M=664580; bool vis ; int prime[M],phi ; int64 sum ; int main() { const int n=getint(); phi[1]=1; for(register int i=2;i<=n;i++) { if(!vis[i]) { prime[++prime[0]]=i; phi[i]=i-1; } for(register int j=1;j<=prime[0]&&i*prime[j]<=n;j++) { vis[i*prime[j]]=true; if(i%prime[j]==0) { phi[i*prime[j]]=phi[i]*prime[j]; break; } phi[i*prime[j]]=phi[i]*phi[prime[j]]; } } for(register int i=1;i<=n;i++) { sum[i]=sum[i-1]+phi[i]; } int64 ans=0; for(register int i=1;i<=prime[0];i++) { ans+=sum[n/prime[i]]; } printf("%lld\n",ans*2-prime[0]); return 0; }
相关文章推荐
- bzoj2818 Gcd
- BZOJ 2818 GCD【欧拉函数】
- bzoj2818 Gcd
- bzoj 2818: Gcd
- [BZOJ2818]Gcd
- [BZOJ 2818]Gcd
- bzoj 2818 Gcd(莫比乌斯反演)
- bzoj 2818: Gcd
- BZOJ 2818: Gcd (莫比乌斯反演)
- bzoj 2818 Gcd 欧拉函数
- 【bzoj2818】Gcd
- BZOJ 2818 Gcd + spoj 4491(莫比乌斯反演 分块)
- bzoj 2818: Gcd 线性筛求欧拉函数
- bzoj 2818 gcd 线性欧拉函数
- [bzoj2818]Gcd 欧拉函数
- 【数论】【枚举】【莫比乌斯反演】【线性筛】bzoj2818 Gcd
- bzoj2818 Gcd
- [BZOJ2818]Gcd(莫比乌斯反演)
- bzoj 2818: Gcd
- BZOJ 2818 Gcd (欧拉筛 \ 莫比乌斯反演)