数论 最大公约数之和

最大公约数之和

题意: ∑ i = 1 n g c d ( i , n ) \sum_{i=1}^ngcd(i, n) i=1ngcd(i,n)

题解

欧拉函数链接:欧拉函数
在这里插入图片描述

AC代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<list>
#include<set>
#include<deque>
#include<vector>
#include<ctime>

using namespace std;
//#pragma GCC optimize(2)
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define ull unsigned long long
#define ll long long
#define rep(i, x, y) for(int i=x;i<=y;i++)
#define mms(x, n) memset(x, n, sizeof(x))
#define mmc(A, tree) memcpy(A, tree, sizeof(tree))
#define INF (0x3f3f3f3f)
#define mod (ull)(1e9+7)
typedef pair<int, int> P;
const int N = 1e6 + 10;
int phi[N];

ll euler(ll n) {
    ll m = n, ans = n;
    for (ll i = 2; i * i <= m; i++) {
        if (n % i == 0) ans = ans / i * (i - 1);
        while (n % i == 0) n /= i;
    }
    if (n > 1) ans = ans / n * (n - 1);
    return ans;
}

int main() {
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
#endif
    ll t;
    scanf("%lld", &t);
    ll ans = 0;
    for (ll i = 1; i * i <= t; i++) {
        if (t % i == 0) {
            ans += i * euler(t / i);
            // 降低复杂度
            if (i * i != t) ans += (t / i) * euler(i);
        }
    }
    printf("%lld\n", ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45934120/article/details/108084555