【欧拉定理+思维】UVA - 11426 GCD - Extreme (II)

版权声明:时间是有限的,知识是无限的,那就需要在有限的时间里最大化的获取知识。 https://blog.csdn.net/Fire_to_cheat_/article/details/82946561

【欧拉定理+思维】UVA - 11426 GCD - Extreme (II)

https://vjudge.net/problem/UVA-11426

题意:
计算
i = 1 i < N j = i + 1 j < = N G C D ( i , j ) \sum{_{i=1}^{i<N}} \sum{_{j=i+1}^{j<=N}}GCD(i,j)

思路:
计算前几项的值
设f[i]表示N为i的解的值
f[1*3]=1*phi(3)
f[2*3]=2*phi(3)
f[3*3]=3*phi(3)
可以猜想f[i*j]=i*phi(j)

#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
#define ll long long

const int MAXN=4e6+5;
ll euler[4000001+10];
int n;
ll f[MAXN];
void getEuler()
{
    memset(euler,0,sizeof(euler));
    euler[1] = 1;
    for(int i = 2; i <= MAXN ; i++)
    { 
	    if(!euler[i])
            for(int j = i; j <= MAXN; j += i)
            {
                if(!euler[j])
                    euler[j] = j;
                euler[j] = euler[j]/i*(i-1);
            }
	    for(int j=1;i*j<MAXN;j++)
		f[i*j]+=j*euler[i];
    }
}

int main()
{
	int n;
	getEuler();
	while(cin>>n&&n!=0)
	{
		ll ans=0;
		for(int i=1;i<=n;i++)ans+=f[i];
		cout<<ans<<endl;
	}
}

猜你喜欢

转载自blog.csdn.net/Fire_to_cheat_/article/details/82946561
今日推荐