zoukankan      html  css  js  c++  java
  • 欧拉函数简单总结

    欧拉筛法&欧拉函数


    1.欧拉筛法

    1. 原理

    通过枚举一个1~n的数和已筛出的质数,他们的积为一个合数

    2. 代码实现

    for(int i=2;i<=n;i++){
    		if(!vis[i]) prime[++tot]=i;
    		for(int j=1;j<=tot;j++){
    			if(1ll*i*prime[j]>n) break;//大于时退出
    			vis[i*prime[j]]=1;//质数的倍数不是质数
    			if(i%prime[j]==0) break; //!!!重要优化
    //令i=k*prime[j] 则 i*prime[j+x] 在i枚举到 k*prime[j+x]时
    //即会被筛去,为了防止重复筛除, break 掉;
    		}
    	}
    

    2. 欧拉函数

    1. 理论知识

    1. 定义: 欧拉函数 (varphi(x)) 为小于等于(x)且与(x)互质的数的个数

    2. 重要性质

    ○1.(varphi(p)=p-1) ((p)是质数).
    ○2.(varphi(x))为积性函数 即 (varphi (p*q)= varphi (p)*varphi (q)) 其中 p,q互质 .
    ○3.(varphi (p^k)=(p-1) p^{k-1}) (p是质数).
    ○4.当p为质数且(p|x)时,(varphi (x*p)=varphi (x)*p)
    ○5.设n是一个正整数,(sum_{d|n}varphi(d)=n)
    ○6.设(1<=k<=n),那么有(sum_{(k,n)=1}k=frac12nvarphi(n))
    ○7.若a与n互质,那么若(a^nequiv b (mod;p))(a^{n;mod;varphi(p)}equiv b(mod;p))(由欧拉定理易得)
    ○8.若(a^nequiv b (mod;p))(a^{n;mod;varphi(p)+varphi(p)} equiv b(mod;p))扩展欧拉定理(不要求a和p互质)

    性质3的证明:
    (ecause p^k) 仅含有 (p) 这一个质因子故小于 (p^k)的不与之互质的数仅有(p)的倍数,共有(dfrac{p^k}{p}=p^{k-1})
    即$varphi (pk)=pk-p{k-1}=p{k-1}*(p-1) $即证

    性质4的证明:
    (ecause p|x)令P为x的质因子集合((1-1/P)=(1-1/p_1)*...*(1-1/p_n))
    ( herefore varphi(x)=x*(1-1/P) ,varphi(p)=p-1)
    ( herefore varphi (x*p)=(x*p)(1-1/P)) (引入p后质因子集合不变 (ecause p)(x)的质因子)
    ( herefore varphi(x*p)=x*(1-1/P)*p= varphi(x)*p,) 即证

    2. 求法 :
    通项公式:$$varphi(x)=x*prod(1-frac1{p_i})其中p为x的质因子$$

    证明如下:

    预备知识:
    1. (varphi(p)=p-1) ( $ p $ 是质数 )
    2. 唯一分解定理: (x=(p_1^{k_1} *p_2^{k_2}dots*p_n^{k_n})) 其中(p)(x)的质因子
    3. (varphi(x))为积性函数 即 (varphi(p*q)=varphi(p)*varphi(q)) 其中 p,q互质 .
    4. (varphi(p^k)=(p-1)×(p^{k-1}))

    证明:
    (varphi(x) = varphi (p_1^{k_1}*p_2^{k_2} dots *p_n^{k_n}))其中(p)(x)的质因子
    (ecause x)的质因子的任何次方都互质
    ( herefore varphi(x)=varphi(p_1^{k_1}) * varphi(p_2^{k_2})*dots*varphi(p_n^{k_n}))
    (varphi(p^k)=(p-1)×(p^{k-1}))

    ( herefore varphi(x)=(p_1-1) ×(p_2-1)*....*(p_n-1)(p_1^{k_1-1} *p_2^{k_2-1}dots*p_n^{k_n-1}))

    前面各项每项提出一个(p_i)乘到后面去即得 (varphi(x)=x*prod(1-dfrac{1}{p_i}))

    4. 公式法和线性递推法求解欧拉函数

    1. (O(sqrt{n})) 公式法
    inline int phi(int x)
    {
    	if(x==1) return 1;
    	int res=x;
    	for(register int i=2;i<=sqrt(x);i++){
    		if(x%i==0){
    			res-=res/i;
    			while(x%i==0) x/=i;
    		}
    	}
    	if(x!=1) res-=res/x;//最后一个也要算;
    	return res;
    }
    

    2.(O(n)) 递推法

    for(int i=2;i<=n;i++){
    		if(!vis[i]) {prime[++tot]=i;phi[i]=i-1;}
    		for(int j=1;j<=tot;j++){
    			if(1ll*i*prime[j]>n) break;
    			vis[i*prime[j]]=1;
    			if(i%prime[j]==0) {
    				phi[i*prime[j]]=phi[i]*prime[j];
    //当 prime[j]是i的约数时,phi[i*prime[j]]=phi[i]*prime[j];
    				break;
    			}
    			phi[i*prime[j]]=phi[i]*(phi[prime[j]]);
    //否则,phi[i*prime[j]]=phi[i]*phi[j] =phi[i]*(prime[j]-1);
    		}
    	}
    

    2. 欧拉函数的一些应用

    例1. 作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。 现在,C君希望你告诉他队伍整齐时能看到的学生人数。luogu-P2158 [SDOI2008]仪仗队
    此处输入图片的描述

    解析:
    观察发现,以观察点的右上为第1行第1列,则能被看到的点(x,y)在第x行第y列,必须满足 gcd(x,y)==1才能被看到,由图的对称性故最后答案应为:
    $$2×(varphi(2)+varphi(3)+....+varphi(N-1))+3$$
    最后加三是对角线、左、右能看到的人。

    例2.给定一个整数N,你需要求出(sum gcd(i, N)(1<=i <=N)) luogu-P2303 Longge的问题

    解析: 令t(x)为 gcd(i,N) 为 x 的个数。∴ t(1)=Φ(N) ;
    $$t(x)=sum (gcd(i,N)x)=sum (gcd(i/x,n/x)1)=sum varphi(n/x)$$
    故当x是n的因数时求出Φ(x/n)即可

    [ans=Σ(x*varphi(n/x)) ]

    例3. 题意:输入 N 和 M (2<=N<=1000000000, 1<=M<=N), 找出所有的X满足1<=X<=N 且 gcd(X,N)>=M.HDU-2588 GCD

    解析:
    1.首先若m==1,则答案为N
    2.m≠1时,初步想法,将N进行质因数分解,则答案为其质因数的组合的积中大于m的组合个数,但实现起来不现实。
    不妨设(gcd(X,N)=Y >=M)
    则: (令X=K*Y,其中一定有gcd(K,N)=1 且 Y|N,即Y是N的约数)
    于是有以下做法:先求出N的所有约数Y,(varphi(N/Y))之和(即符合条件的K的个数)
    即为答案
    为什么是(varphi(N/Y))呢? 因为这样才能保证 (K*Y<=N)

  • 相关阅读:
    商户编号前三位代码对应的收单机构大全
    使用邮件模板(freemarker.jar)发送邮件
    Struts2自定义拦截器
    如何在jsp页面显示存储在数据库的图片
    正则表达式 大于0的数字(包含小数)
    Linux的关机命令
    maven的下载和安装
    web.py的安装
    安装第三方插件BeautifulSoup
    myeclipse离线安装pydev插件
  • 原文地址:https://www.cnblogs.com/NeosKnight/p/10391132.html
Copyright © 2011-2022 走看看