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

posted @ 2025-07-11 23:39  fyv233  阅读(8)  评论(0)    收藏  举报