【题解】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;
}