O - GCD - Extreme (II)(欧拉函数)

题目链接:https://vjudge.net/problem/UVA-11426

 

大致题意:让求一个数G,满足a,b<=n,a<b,G+=gcd(a,b)

 

大致思路:根据欧拉函数,a,b互质(a<b),因此gcd(a,b)=1,而gcd(2*a,2*b)=2,gcd(3*a,3*b)=3...gcd(n*a,n*b)=n

 

 

 

#include <iostream>
#include <cstring>

using namespace std;

const long long maxn=4000001+100;

int n;
long long phi[maxn],a[maxn];

void Phi()
{
    memset(a,0,sizeof(a));
    for(int i=1;i<=maxn;i++) phi[i]=i;

    for(int i=2;i<=maxn;i++)
    {
        if(phi[i]==i)
        {
            for(int j=i;j<=maxn;j+=i)
            {
                phi[j]=phi[j]/i*(i-1);
            }
        }
        for(int j=1;j*i<=maxn;j++)
        {
            a[j*i]+=j*phi[i];
        }
    }
    for(int i=1;i<=maxn;i++)
    {
        a[i]+=a[i-1];
    }
}

int main()
{
    Phi();

    while(cin>>n&&n!=0)
    {
        cout<<a[n]<<endl;
    }

    return 0;
}

 

posted @ 2018-05-01 15:51  Somnus、M  阅读(123)  评论(0编辑  收藏  举报