[SDOi2012]Longge的问题

题面
g c d ( n , m ) = i gcd(n,m)=i gcd(n,m)=i转换为 g c d ( n / i , m / i ) = 1 gcd(n/i,m/i)=1 gcd(n/i,m/i)=1
就能转换为欧拉函数了
那么对于数 i i i对答案的贡献就是 i × φ ( i ) i×φ(i) i×φ(i)
不是太难 自己推推就能推出来
算是挺好的一个结论了 不过都考烂糊了不能再考了 洛谷上都有 8 8 8道跟这个一个思路的题了…

#include
using namespace std;
typedef long long ll;
ll phi(ll x){
	ll res=x;
	for(ll i=2LL;i*i<=x;i++){
		if(x%i==0)res=res/i*(i-1);
		while(x%i==0)x/=i;
	}
	if(x>1)res=res/x*(x-1);
	return res;
}
ll f(ll n){
	ll res=0LL;
	for(ll i=1LL;i*i<=n;i++){
		if(n%i==0){
			res+=i*phi(n/i);
			if(i*i!=n)res+=(n/i)*phi(i);
		}
	}
	return res;
}
ll n;
int main(){
	scanf("%lld",&n);
	printf("%lld\n",f(n));
}

你可能感兴趣的:(数论)