【题解】P2303 [SDOi2012]Longge的问题

\(Description:\)

求出\(\sum_{i=1}^{n}gcd(i,n)\)的值

\(Sample\) \(Input:\)

6

\(Sample\) \(Output:\)

15

\(Hint:\)

\(n<={MAX}{INT}\)

哇塞,这题数据范围真棒!

考虑要么是sqrt,要么log

看gcd这个样子多半不会是log

但是不能臆断!考虑对这个式子进行gcd化简

设d为\(gcd(i,n)\)

\(gcd(i/d,n/d)=1\),发现这好像说明d是n的约数?

废话

那么考虑每一个n的约数d对答案的贡献:

\(x\)为与\(n/d\)互质的数的个数,那么就是\(d*x\)

因为总共会有x次gcd的值为d

那么只要\(\sqrt{n}\)枚举约数,在每个约数求\(\phi\)就可以了

复杂度不会证。。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,cnt,ans;
inline int phi(int x){
	int ret=x;
	for(int i=2;i*i<=x;++i){
		if(x%i==0){
			ret=ret/i*(i-1);
			while(x%i==0) x/=i;
		}
	}
	if(x>1) ret=ret/x*(x-1);
	return ret;
}
inline void divide(int x){
	for(int i=1;i*i<=x;++i){
		if(x%i==0){
			ans+=phi(n/i)*i;
			if(i*i!=x) ans+=phi(i)*(n/i);
		}
	}
}
signed main(){
	scanf("%lld",&n);
	divide(n);
	printf("%lld\n",ans);
	return 0;
}
posted @ 2019-04-09 22:11  章鱼那个哥  阅读(88)  评论(0编辑  收藏  举报