AcWing 220.最大公约数 欧拉函数打卡

题目:https://www.acwing.com/problem/content/222/

题意:求1-n范围内,gcd(x,y)是素数的对数

思路:首先我们可以针对每个素数p,那么他的贡献应该时   [1,n/p] 互质的对数,这个其实就是遍历这个范围累加每个数的欧拉值,这里我们就可以用个前缀和,然后计算即可

#include<bits/stdc++.h>
#define maxn 10000005
#define len 100005
#define mod 1000000007
using namespace std;
typedef long long ll;
ll mark[maxn];
ll phi[maxn];
ll pri[maxn];
ll sum[maxn];
int tot;
ll n;
void getphi()//欧拉表
{
    phi[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(!mark[i]){phi[i]=i-1;pri[++tot]=i;}
        for(int j=1;j<=tot;j++)
        {
            int x=pri[j];
            if(i*x>n)break;
            mark[i*x]=1;
            if(i%x==0){phi[i*x]=phi[i]*x;break;}
            else phi[i*x]=phi[i]*phi[x];
        }
    }
}
int main(){
    scanf("%lld",&n);
    getphi();
    sum[0]=phi[0];
    for(int i=1;i<=n;i++) sum[i]=sum[i-1]+phi[i];
    ll num=0;
    for(int i=1;i<=tot;i++){
        num+=2*sum[n/pri[i]]-1;
    } 
    printf("%lld",num);
} 

猜你喜欢

转载自www.cnblogs.com/Lis-/p/11285843.html