1. 程式人生 > >51nod-1040-1040 最大公約數之和(尤拉函式)

51nod-1040-1040 最大公約數之和(尤拉函式)

原題連結

給出一個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的所有因子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;
}