POJ- 2480 Longge's problem(欧拉函数)

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;
}

猜你喜欢

转载自blog.csdn.net/henu_jizhideqingwa/article/details/81460171
今日推荐