今天在学数论基础这一题一开始看到题目先打了个暴力GCD
结果很明显,TLE
然后我发现我枚举的数的GCD==1,不就相当于是和这个数互质的数吗?
那么想到了欧拉函数,于是乎百度了欧拉函数,顺利A了此题,下面是代码
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
long long n,ans;
int gcd(int a,int b){
if(b==0){
return a;
}else{
return gcd(b,a%b);
}
}
int euler[40005];
void Init(){
euler[1]=1;
for(int i=2;i<40003;i++){
euler[i]=i;
}
for(int i=2;i<40003;i++){
if(euler[i]==i){
for(int j=i;j<40003;j+=i){
euler[j]=euler[j]/i*(i-1);//先进行除法是为了防止中间数据的溢出
}
}
}
}
int main(){
cin>>n;
Init();
for(int i=1;i<=n-1;i++){
//for(int j=1;j<=n-1;j++){
//if(gcd(i,j)==1){
ans+=euler[i];
//}
}
ans*=2;
cout<<ans+1<<endl;
return 0;
}
/*
in:
4
out:
9
in:
6
out:
20
*/