51nod-1040-1040 最大公約數之和(尤拉函式)
阿新 • • 發佈:2019-01-23
給出一個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示例
6Output示例
15
先求出n的所有因子a, 再求出1到中滿足與n的最大公約數為a的數個數,因為gcd(m, n) == a, 所以gcd(m / a, n/a) == 1
m/a <= n/a, 現在問題就變成求小於等於n/a與n/a互質的數的個數
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll euler(ll m){ ll ans = m; for(ll i = 2; i * i <= m; i++){ if(m % i == 0){ ans = ans / i * (i - 1); while(m % i == 0) m /= i; } } if(m > 1) ans = ans / m * (m - 1); return ans; } int main(){ ll n; ll ans = 0; scanf("%I64d", &n); for(ll i = 1; i * i <= n; i++){ if(n % i == 0){ ans += (n/i) * euler(i); if(i != n / i){ ans += i * euler(n/i); } } } printf("%I64d\n", ans); return 0; }