zoukankan      html  css  js  c++  java
  • 欧拉函数介绍及简单模板

    欧拉函数:对于一个正整数n,小于n且与n互质的正整数的个数,记做:φ(n),其中φ(1)被定义为1,但是并没有任何实质的意义。

    特殊性质:当n为奇数时,φ(2n)=φ(n)。

    当n为素数时:φ(n) = n - 1;

    (1)φ(n) = n * (1 - 1/p1) * (1 - 1 / p2) * ... * (1 - 1 / pn)    (pi是n的质因子)

    求小于n且与n互质的数有多少个

    http://poj.org/problem?id=2407

    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    #include<stdlib.h>
    #include<algorithm>
    
    using namespace std;
    
    typedef long long ll;
    
    const ll INF = 0x3f3f3f3f;
    
    int main()
    {
        ll n;
        while(~scanf("%lld", &n), n)
        {
            ll ans = n;
            for(ll i = 2 ; i * i <= n ; i++)
            {
                if(n % i == 0)
                {
                    ans -= ans / i;
                    while(n % i == 0)
                    {
                        n /= i;
                    }
                }
            }
            if(n > 1)
                ans -= ans / n;
            printf("%lld
    ", ans);
        }
        return 0;
    }

    (2)当n = p^k时,φ(n)  = φ(p^k) = p^k - p^(k - 1)

    证明:比p^k小的数总共有p^k - 1个,与p^k不互质的数有:

     p*1, p * 2, p * 3, ... , p^k - p(即p(p^(k - 1)- 1))共p^(k - 1)- 1个

    所以与p^k互质的数有p^k - 1 - (p^(k - 1)- 1) = p^k - p^(k - 1)个

    即φ(n)  = φ(p^k) = p^k - p^(k - 1)

    (3)当n = p * q 时,φ(n) = φ(p * q) = φ(p) * φ(q), gcd(p, q) = 1;

    原根:
     
    如果a不被素数p整除,则a模p的阶是指使得a^e=1(mod m)(即a^e % m = 1)的最小指数e>=1;例如2、3、4、5、6模7的阶分别是3、6、3、6、2。
     
    一个重要的性质:一个数a模m的阶e总能整除m-1。
     
     
    设m是正整数,a是整数,若a模m的阶等于φ(m)(即a^φ(m) % m = 1),则称a为模m的一个原根。(其中φ(m)表示m的欧拉函数
     
    奇素数p的原根个数 = φ(p - 1)
     
     
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<stdlib.h>
    #include<algorithm>
    
    using namespace std;
    
    int main()
    {
        int n;
        while(~scanf("%d", &n))
        {
            n = n - 1;
            int ans = n;
            for(int i = 2 ; i * i <= n ; i++)
            {
                if(n % i == 0)
                {
                    ans -= ans / i;
                    while(n % i == 0)
                        n /= i;
                }
            }
            if(n > 1)
                ans -= ans / n;
            printf("%d
    ", ans);
        }
        return 0;
    }
     
  • 相关阅读:
    164 Maximum Gap 最大间距
    162 Find Peak Element 寻找峰值
    160 Intersection of Two Linked Lists 相交链表
    155 Min Stack 最小栈
    154 Find Minimum in Rotated Sorted Array II
    153 Find Minimum in Rotated Sorted Array 旋转数组的最小值
    152 Maximum Product Subarray 乘积最大子序列
    151 Reverse Words in a String 翻转字符串里的单词
    bzoj3994: [SDOI2015]约数个数和
    bzoj 4590: [Shoi2015]自动刷题机
  • 原文地址:https://www.cnblogs.com/qq2424260747/p/4920404.html
Copyright © 2011-2022 走看看