【SDOI2012】Longge 的问题 题解(欧拉函数)

前言:还算比较简单的数学题,我这种数学蒟蒻也会做QAQ。

---------------

题意:求$sumlimits_{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*prodlimits_{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;
}
原文地址:https://www.cnblogs.com/Invictus-Ocean/p/13033642.html