求(sum limits_{i = 1}^n gcd(i, n))
(sum limits_{i = 1}^n gcd(i, n))
(=sum limits_{i = 1}^n sumlimits_{d|i;and;d|n} varphi(d))
(=sum limits_{d |n} varphi(d) * frac{n}{d})
然后就可以以一个很低的复杂度过了
反正复杂度是不会超过(O(sqrt n * d(n)))的
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll n, ans;
inline ll phi(ll m) {
ll ret = m;
for(ll t = 2; t * t <= m; t ++)
if(m % t == 0) {
while(m % t == 0) m /= t;
ret /= t; ret *= (t - 1);
}
if(m > 1) ret /= m, ret *= (m - 1);
return ret;
}
int main() {
cin >> n;
for(ll i = 1; i * i <= n; i ++)
if(n % i == 0) {
ans += phi(i) * (n / i);
if(n / i != i) ans += phi(n / i) * i;
}
printf("%lld
", ans);
return 0;
}