码迷,mamicode.com
首页 > 其他好文 > 详细

[题解](gcd/欧拉函数)luogu_P2568_GCD

时间:2019-05-14 22:03:37      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:nbsp   \n   ||   cstring   lld   int   重复   break   ++   

求gcd(x,y)=p等价于求gcd(x/p,y/p)=1,转化为了n/p内互质的个数

所以欧拉函数,因为有序所以乘2,再特判一下只有在1,1情况下才会重复计算,所以每次都减一

数组开小一时爽,提交wa火葬场!!!

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=10000009;
int n;
int ck[maxn],prime[maxn],phi[maxn],tot;
long long sum[maxn];
void eular(int n){
    phi[1]=1;
    for(int i=2;i<=n;i++){
        if(!ck[i]){
            ck[i]=i,prime[++tot]=i;
            phi[i]=i-1;
        }
        for(int j=1;j<=tot;j++){
            if(prime[j]>ck[i] || i*prime[j]>n)break;
            ck[prime[j]*i]=prime[j];
            phi[i*prime[j]]=phi[i]*(i%prime[j]?prime[j]-1:prime[j]);
        }
    }
}
int main(){
    scanf("%d",&n);
    eular(n);
    for(int i=1;i<=n;i++)sum[i]=sum[i-1]+phi[i];
    long long ans=0;
    for(int i=1;i<=tot;i++){
        ans+=2*sum[n/prime[i]]-1;
    }
    printf("%lld\n",ans);
}

 

[题解](gcd/欧拉函数)luogu_P2568_GCD

标签:nbsp   \n   ||   cstring   lld   int   重复   break   ++   

原文地址:https://www.cnblogs.com/superminivan/p/10864805.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!