简单纯朴
改写一下式子即可
不过开longlong真是玄学,疯狂WA#5
#include<bits/stdc++.h> using namespace std; int tot,pr[(1<<16)+5],flg[(1<<16)+5]; long long pi(long long tp) { long long phi=tp; for(int i=1;i<=tot&&1LL*pr[i]*pr[i]<=tp;i++) if(tp%pr[i]==0) { phi=phi/pr[i]*(pr[i]-1); while(tp%pr[i]==0)tp/=pr[i]; } if(tp>1)phi=phi/tp*(tp-1); return phi; } int main() { long long num; cin>>num; long long int qt=(int)sqrt(num); for(int i=2;i<=qt;i++) { if(!flg[i])pr[++tot]=i; for(int j=1;j<=tot&&i*pr[j]<=qt;j++){ flg[i*pr[j]]=1; if(i%pr[j]==0)break; } } long long ans=0; for(long long int i=1;i*i<=num;i++) if(num%i==0) { ans+=i*pi(num/i); if(i*i!=num)ans+=num/i*pi(i); } cout<<ans; }