Gcd II

时间:2019-08-11
本文章向大家介绍Gcd II,主要包括Gcd II使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题目描述

给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对.

输入

一个整数N(1≤N≤10^7)

输出

样例输入

4

样例输出

4

提示

对于样例(2,2),(2,4),(3,3),(4,2)

#include <bits/stdc++.h>

using namespace std;

const int N=1e7+1;
typedef long long ll;
int phi[N],prime[780000],n,tot;
ll ans,sum[N];
bool vis[N+1];
void get_euler(int n)
{
    phi[1]=1;
    for (int i=2; i<=n; i++)
    {
        if (!vis[i])
        {
            prime[tot++]=i;
            phi[i]=i-1;
        }
        for (int j=0; j<tot&&1ll*prime[j]*i<=n; j++)
        {
            vis[prime[j]*i]=1;
            if (i%prime[j]==0)
            {
                phi[i*prime[j]]=phi[i]*prime[j];
                break;
            }
            phi[i*prime[j]]=phi[i]*phi[prime[j]];
        }
    }
}

int main()
{
    int n;
    scanf("%d",&n);
    get_euler(n);
    for (int i=1;i<=n;i++){
        sum[i]=sum[i-1]+phi[i];
    }
    for (int i=0;i<tot;i++){
        ans+=sum[n/prime[i]]*2-1;
    }
    printf("%lld\n",ans);
    return 0;
}

  

原文地址:https://www.cnblogs.com/Accpted/p/11335106.html