zoukankan      html  css  js  c++  java
  • 【欧拉函数】回顾

        欧拉函数 : 小于n的正整数中与n互质的数的数目(φ(1)=1)

    有几个性质:p为质数

    * p的欧拉函数的值:p - 1

    * p^k的欧拉函数为p^k - p^k-1=p^k(1 - 1/p)[p为质数,k为大于等于1的正整数]       

      因为p是质数,所以当一个数不包含质数p才可能与n互质,所以一共有p^k-1个数据1*p,2*p,3*p……p^k-1 * p

    * 若n = p1 * p2 且p1 p2 互质,那么——n的欧拉函数的值就是p1的欧拉值*p2的欧拉值

    由这三个点就可以得出加上+任意n都可以写成p1^k1*p2^k2*……pr^kr:

    n的欧拉函数的通项是 = n * (1 - /p1)* (1 - 1/ p2) * …… (1 - 1/ pr)

    * 除了n = 2的时候任何数的欧拉函数的值都是偶数 * 反过来n的欧拉函数的值等于A,那么给出任意A求其对应的n(如果对应的A没有n那就找A+1知道找到n)就会发现A对应的n的值是大于等于A的最小质数

    * 小于n且与n互质的数的和是n的欧拉函数的值 * n / 2

    typedef long long ll;
    ll  Euler(ll  n)
    {
        ll res = n;
        for(ll p = 2;p*p <= n;p++)
        {
            /*任意n都可以写成p1^k1*p2^k2*……pr^kr:
            n的欧拉函数的通项是
            = n * (1 - /p1)* (1 - 1/ p2) * …… (1 - 1/ pr)
            */
            if(n % p == 0)res = res / p * (p - 1);
            while(n % p == 0) n/= p;
        }
        if(n > 1)res = res / n * (n - 1);
        return res;
    }
    

     单一求取太慢了,而一个数得欧拉函数值是确定的,所以我们完全可以打表,线性筛求取(借助了素数筛)

    * 如果n = i * p ,i % p == 0 且p 为质数的话 n的欧拉值就是p * i的欧拉值

    * 如果n = i * p ,i % p != 0 且p 为质数的话 n的欧拉值就是p 的欧拉值* i的欧拉值

    const int maxn = 1e6 + 1e3;
    int mark[maxn],pri[maxn],phi[maxn];
    int tot;
    void Euler(ll n = maxn)
    {
        memset(mark,0,sizeof(mark));
        tot = 0;
        phi[1] = 1;
        for(int i = 2;i < maxn;i++)
        {
            if(!mark[i])
            {
                pri[tot++] = i;
                phi[i] = i -1;
            }
            for(int j = 0;j < tot;j++)
            {
                int x = pri[j];
                if(x * i >= maxn)break;
                mark[i * x] = 1;
                if( i % x == 0)
                {
                    phi[i * x] = phi[i] * x;
                    break;
                }
                else
                {
                    phi[i * x] = phi[i] * phi[x];
                }
            }
        }
    }
    
  • 相关阅读:
    LeetCode K Closest Points to Origin
    LeetCode Largest Number
    LeetCode Sort List
    LeetCode Sort Colors
    LeetCode Matrix Cells in Distance Order
    spring定时任务的几种实现方式
    maven构建这么慢,怎么改变?
    序列化框架性能对比(kryo、hessian、java、protostuff)
    java的静态方法的使用
    jvm的可见性的理解
  • 原文地址:https://www.cnblogs.com/DF-yimeng/p/8585504.html
Copyright © 2011-2022 走看看