51Nod1040 最大公约数之和 欧拉函数

来源:互联网 发布:卡盟域名是什么 编辑:程序博客网 时间:2024/05/24 07:19

给出一个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
公约数之和
Sample Input
6
Sample Output
15

对于n的每一个约数m,(1~n)中与n的最大公约数为m的个数 等于 (1~n/m )中和 n/m 互质的个数,即欧拉函数值E(n/m)

这里写图片描述
这里写图片描述

#include<bits/stdc++.h>const int INF  = 0x3f3f3f3f;const int Maxn = 1e7 * 2;const int mod  = 2333333;#define ll long long#define mem(x,y) memset(x,y,sizeof(x))using namespace std;long long Eular(long long m) { // 欧拉函数    long long ans = m;    for (int i = 2; i * i <= m; i++) {        if (m % i == 0) {            ans -= ans / i;            while (m % i == 0) m /= i;        }    }    if (m > 1) ans -= ans / m;    return ans;    // 或//    long long k = 1;//    for (ll i = 2; i * i <= m; i++) {//        if (m % i == 0) {//            k *= (i - 1);//            while (m % i == 0) {//                m /= i;//                k *= i;//            }//            k /= i;//        }//        cout<<k<<endl;//    }//    if (m > 1) {//        k = k * (m - 1) ;//    }//    return k;}int main() {    long long m;    while (cin >> m) {        cout << Eular(m) << endl;    }}