P2303 Longge 的问题
\[\begin{align*}
\sum\limits_{i=1}^n \gcd(i, n)
& = \sum\limits_{d|n}d\sum\limits_{i = 1}^n[\gcd(i,n) == d] \\
& = \sum\limits_{d|n}d\sum\limits_{i = 1}^{\frac{n}{d}}[\gcd(i,\frac{n}{d}) == 1] \\
& = \sum\limits_{d|n}d\varphi(\frac{n}{d})
\end{align*}
\]
欧拉筛预处理 \(\varphi\) 枚举即可。
代码如下:
#include <bits/stdc++.h>
#define int long long
using namespace std;
int euler(int n){
int ans = n;
for(int i=2;i*i<=n;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;
}
signed main(){
int n, sum = 0;
cin>>n;
for(int i=1;i*i<=n;i++){
if(n%i!=0) continue;
if(i*i == n) sum = sum + i*euler(n/i);
else sum = sum + i*euler(n/i) + (n/i)*euler(i);
}
cout<<sum<<'\n';
}

浙公网安备 33010602011771号