【SDOI2012】Longge 的问题 题解(欧拉函数)
前言:还算比较简单的数学题,我这种数学蒟蒻也会做QAQ。
---------------
题意:求$\sum\limits_{i=1}^n gcd(i,n)$的值。
设$gcd(i,n)=d$,即$d$为$i$和$n$的因数,那么有$gcd(i/d,n/d)=1$。假设我们求出了$x$个满足条件的$i$,那么总的结果就是$x*d$。我们因此可以枚举$n$的因数,累加即可。注意判断$n$是不是完全平方数。
问题来了:怎么求满足$gcd(i/d,n/d)=1$的$i$的个数?欧拉函数啊!我们可以$\sqrt n$地求出$φ(n/i)$,结果就是$φ(n/i)*d$。
注:欧拉函数的通式为$φ(x)=x*\prod\limits_{i=1}^n (1-\frac{1}{p_i})$ ($p_i$为$x$的质因数)
代码:
#include<bits/stdc++.h> #define int long long using namespace std; int n,ans; int phi(int x) { int res=x; for (int i=2;i*i<=x;i++) { if (x%i==0) { res=res*(i-1)/i; while(x%i==0) x/=i; } } if (x>1) res=res*(x-1)/x; return res; } signed main() { scanf("%lld",&n); int sq=sqrt(n); for (int i=1;i<=sq;i++) { if (n%i==0) { ans+=phi(n/i)*i; if (i*i!=n) ans+=phi(i)*(n/i); } } cout<<ans; return 0; }