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; }