我连这种水题都不会做啦……感觉要炸啊……
n
的最大公约数必定是
观察等式
由于这题的数据范围过大,
n≤1e9
,我们不能直接
O(n)
算欧拉函数,好像也不需要哈,可以对每个
n
<script type="math/tex" id="MathJax-Element-72">n</script>的因数单独算一次欧拉函数。
附上AC代码:
#include <cstdio>
using namespace std;
int n;
long long ans;
inline long long eular(int x){
long long ret=1;
for (int i=2; i*i<=x; ++i)
if (x%i==0){
x/=i,ret*=i-1;
while (x%i==0) x/=i,ret*=i;
}
return x>1?ret*(x-1):ret;
}
int main(void){
scanf("%d",&n);
for (int i=1; i*i<=n; ++i)
if (n%i==0){
int t=n/i;
ans+=1ll*i*eular(t);
if (i!=t) ans+=1ll*t*eular(n/t);
}
return printf("%lld\n",ans),0;
}