• HDU 3501【欧拉函数拓展】


    欧拉函数

    欧拉函数是指:对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) 。
    通式:φ(x)=x*(1-1/p1)(1-1/p2)(1-1/p3)*(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数,x是不为0的整数。φ(1)=1(唯一和1互质的数就是1本身)。
    对于质数p,φ(p) = p - 1。注意φ(1)=1.
    欧拉定理:对于互质的正整数a和n,有aφ(n) ≡ 1 mod n。
    欧拉函数是积性函数——若m,n互质,φ(mn)=φ(m)φ(n)。
    若n是质数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因为除了p的倍数外,其他数都跟n互质。
    特殊性质:当n为奇数时,φ(2n)=φ(n)

    欧拉函数还有这样的性质:
    设a为N的质因数,
    若(N % a == 0 && (N / a) % a == 0) 则有E(N)=E(N / a) * a;
    若(N % a == 0 && (N / a) % a != 0) 则有:E(N) = E(N / a) * (a - 1)。

    欧拉公式的延伸:一个数的所有质因子之和是euler(n)*n/2。

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const LL mod=1e9+7;
    
    LL eluer(LL n)
    {
        LL res=n,a=n;
        for(LL i=2;i*i<=a;i++)
        {
            if(a%i==0)
            {
                res=res/i*(i-1);
                while(a%i==0)
                    a/=i;
            }
        }
        if(a>1) res=res/a*(a-1);
        return res;
    }
    
    int main()
    {
        LL n,ans;
        while(~scanf("%lld",&n)&&n)
        {
            ans=n*(n+1)/2-n;
            ans=(ans-eluer(n)*n/2)%mod;
            printf("%lld
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    Day3-B-Round Marriage CodeForces-981F
    Day3-A-Problem H. Monster Hunter HDU6326
    Day3-G
    Day3-I-Squares POJ2002
    Day3-M-Cable master POJ1064
    Day3-N
    Day3-O-Median POJ3579
    Day3-P
    Day3-L-Cup HDU2289
    LeetCode "Majority Element"
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934772.html
Copyright © 2020-2023  润新知