版权声明:时间是有限的,知识是无限的,那就需要在有限的时间里最大化的获取知识。 https://blog.csdn.net/Fire_to_cheat_/article/details/82946561
【欧拉定理+思维】UVA - 11426 GCD - Extreme (II)
https://vjudge.net/problem/UVA-11426
题意:
计算
思路:
计算前几项的值
设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;
}
}