[模板]筛选法求欧拉函数

来源:互联网 发布:mac磁盘权限修复 编辑:程序博客网 时间:2024/05/01 07:00

欧拉函数

     对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。例如euler(8)=4,因为1,3,5,7均和8互质。
     Euler函数表达通式:euler(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn),其中p1,p2……pn为x的所有素因数,x是不为0的整数。euler(1)=1(唯一和1互质的数就是1本身)。 
     欧拉公式的延伸:一个数的所有质因子之和是euler(n)*n/2。

     那么如何变成实现欧拉函数呢?下面通过两种不同的方法来实现。

至于应用的方面,我对这方面接触不多,所以好好看看下面的题目吧。

  *欧拉函数:
    数论里很多地方都能用到欧拉函数,很重要的。
    pku1284 Primitive Roots (很水)
   http://acm.pku.edu.cn/JudgeOnline/problem?id=1284
    pku2407 Relatives (很水)
   http://acm.pku.edu.cn/JudgeOnline/problem?id=2407
    pku2773 Happy 2006
   http://162.105.81.212/JudgeOnline/problem?id=2773
    pku2478 Farey Sequence (快速求欧拉函数)
   http://162.105.81.212/JudgeOnline/problem?id=2478
    pku3090 Visible Lattice Points (法雷级数)
   http://acm.pku.edu.cn/JudgeOnline/problem?id=3090
    *推荐:(欧拉函数,费马小定理)
    pku3358 Period of an Infinite Binary Expansion
   http://acm.pku.edu.cn/JudgeOnline/problem?id=3358

int euler[MAXN+1];void getEuler(){    memset(euler,0,sizeof(euler));    euler[1] = 1;    for(int i = 2;i<MAXN;i++)        if (!euler[i])        for(int j = i; j <MAXN;j += i)    {        if (!euler[j]) euler[j] = j;        euler[j] = euler[j]/i*(i-1);    }}long long eular(long long n){    long long ans = n;    for(int i = 2;i*i<=n;i++)    {        if (n% i ==0)        {            ans = ans - ans/i;            while(n % i ==0 )                n /= i;        }    }    if (n>1) ans -=ans/n;    return ans;}


0 0
原创粉丝点击