zoukankan      html  css  js  c++  java
  • 【NOIp复习】欧拉函数

    基础

    • 欧拉函数phi(x)是指从1…x与x互质的自然数的个数
    • 性质1:如果p是质数,phi(p)=p-1,phi(p^k)=p^k-p^(k-1)
    • 性质2:如果p,k互质,phi(p*k)=phi(p)*phi(k)

    然后就得到了百度百科的那个通式:
    phi(x)=x*(1-1/p1)(1-1/pn);

    所以任何一个数,只需要分解质因数,把每个p^k都乘起来就是这个数的欧拉函数值了。在C++中这样表达:

    int phi(int n){
        int m=(int)sqrt(n+0.5);//筛质数的上界 
        int ans=n;
        for(int i=2;i<=m;i++) if(n&i==0){//找到n的质因数i 
            ans=ans/i*(i-1);
            while(n%i==0) n/=i;//一直把n除到没有因数i为止 
        }
        if(n>1) ans=ans/n*(n-1);//phi(1)=1,so... 
        return ans;
    }

    筛法:

    int phi_table(int n){
        for(int i=1;i<=n;i++) phi[i]=0;
        phi[1]=1;//特别定义
        for(int i=2;i<=n;i++)
            if(!phi[i]){
                for(int j=1;j<=n;j+=i){
                    if(!phi[j]) phi[j]=j;
                    phi[j]=phi[j]/i*(i-1);
                }
            } 
    }

    奇技淫巧的应用

    • 不大于x的与x互质的数和为phi(x)*x/2

    例题整理

    1. 法雷级数由一系列不能约分的分数按递增的顺序排列组成,现在让你求出第n项法雷级数包含多少个分数。
    2. 让找出从(0,0)点出发到(n,n)点之间只经过两点的直线的数目。
    3. 对于给定的整数L,找出L能整除最短的全8序列的长度,做为Bob的幸运数字。
    4. 记P_i表示正整数i的质因数集合.
      已知正整数n,求满足下列条件的有序正整数对(a,b)的数目:
      (1)1<=a<=b<=n;
      (2)t为a,b的最大公约数,P_t是P_n的子集.
    5. POJ 3696(文章里面说的“欧拉公式”实际上指欧拉定理:a^phi(m)≡1(mod m),所以同余方程a^x≡1(mod m)的解一定是phi(m)的因数)
    6. [HDU 2588] 计算1~n中有多少个数和n的最大公因数比m大(将n分解为a*b,如果gcd(n,x)=a那么x=a*d,其中d是一个比b小的与b互质的数。所以确定了a过后phi(b)就是x的个数了,从m开始(或者从sqrt(n)开始,看哪个更小)枚举)

    好难啊!完全不会!

  • 相关阅读:
    什么是 canvas(画布)?
    JavaScript
    JavaScript函数
    JavaScript事件
    JavaScript获取元素
    文件拷贝——高淇JAVA300讲笔记之IO和File
    读取与写出文件——高淇JAVA300讲笔记之IO和File
    File类的常用方法2——高淇JAVA300讲笔记之IO和File
    File类的常用方法1——高淇JAVA300讲笔记之IO和File
    路径常量,绝对路径与相对路径,构造File对象——高淇JAVA300讲笔记之IO和File
  • 原文地址:https://www.cnblogs.com/leotan0321/p/6081392.html
Copyright © 2011-2022 走看看