• 【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;
    }
  • 相关阅读:
    (OK) MIMP
    (OK) MIMP
    (OK) MIMP
    Linux内核报文收发-L3
    【Linux4.1.12源码分析】邻居子系统实现分析
    (OK) MIMP
    (OK) MIMP
    (OK) MIMP
    (OK) MIMP
    (OK) MIMP
  • 原文地址:https://www.cnblogs.com/Invictus-Ocean/p/13033642.html
Copyright © 2020-2023  润新知