51nod-1040 最大公約數之和(尤拉函式)
阿新 • • 發佈:2018-12-24
基準時間限制:1 秒 空間限制:131072 KB 分值: 80 難度:5級演算法題
給出一個n,求1-n這n個數,同n的最大公約數的和。比如:n = 6
1,2,3,4,5,6 同6的最大公約數分別為1,2,3,2,1,6,加在一起 = 15
Input
1個數N(N <= 10^9)
Output
公約數之和
Input示例
6
Output示例
15
題解:
n的最大公約數一定是n的因子v,所以考慮列舉因子分別求他們的個數num,那麼因子v對答案的貢獻就是v*num
相當於求[1-n]中 GCD(a[i],n) = v的個數,也就成了GCD(a[i]/v,n/v)=1的個數。 尤拉函式求出即可。
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define ll long long ll n,ans; ll ol(ll x) { ll i,res=x; for(i=2;i*i<=x;i++) { if(x%i==0) { res=res-res/i; while(x%i==0) x/=i; } } if(x>1) res=res-res/x; return res; } int main(void) { while(scanf("%lld",&n)!=EOF) { ans=0; for(ll i=1;i*i<=n;i++) { if(n%i!=0) continue; ll tmp=n/i; ans+=i*ol(tmp); if(i!=tmp) ans+=tmp*ol(n/tmp); } printf("%lld\n",ans); } return 0; }