http://poj.org/problem?id=2480
题意:
求N 与「1,N」 的最大公因数之和
思路:
对于1-N,如果是N的因子,那么就求N/j的欧拉数,直接欧拉模版一套,OK
#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <map>
using namespace std;
#define ll long long
ll phi(ll n) {
ll rea = n;
for (ll i = 2; i * i <= n; i ++){
if(n % i == 0) {
rea = rea - rea / i;
do{
n /= i;
}while(n % i == 0);
}
}
if (n > 1)
rea = rea - rea / n;
return rea;
}
int main(int argc, const char * argv[]) {
ll n;
while(scanf("%lld", &n) != EOF) {
ll ans = 0;
for (ll i = 1; i * i <= n; i ++) {
if(n % i == 0) {
ans += i * phi(n / i);//i是最大公因数,phi(n/i)是求与n/i互质的数的数量
if(i * i != n)//因为是logN,所以另一半也要算一下
ans += n / i * phi(i);
}
}
printf("%lld\n", ans);
}
return 0;
}