zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    python实现七段数码管显示
    词频统计实例
    分形几何中科赫雪花的绘制
    脚本实现自动化绘制
    Android查看数据库方法及工具(转)
    2011年度总结
    Bad NPObject as private data 解决方案
    LINQ学习之旅——LINQ TO SQL继承支持(转载)
    我记录开源系统1.6源码解析(一)
    2011年度总结
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934772.html
Copyright © 2011-2022 走看看