菜鸟系列——欧拉函数

来源:互联网 发布:淘宝添加背景图片代码 编辑:程序博客网 时间:2024/05/17 07:59

菜鸟就要老老实实重新学起:

euler欧拉函数:

欧拉函数就是小于n的数中与n互质的数的数目。

用法经常比较神奇,数论嘛,还是看能不能想到用出来。

这里的模版参考挑战那本书的。

模版:

//直接求解欧拉函数long long euler(long long n){     long long res=n,a=n;     for(long long i=2;i*i<=a;i++)         if(a%i==0)         {             res=res/i*(i-1);             while(a%i==0) a/=i;         }     if(a>1) res=res/a*(a-1);     return res;}//筛选法打欧拉函数表long long eul[N];void init(){     eul[1]=1;     for(long long i=2;i<N;i++)       eul[i]=i;     for(long long i=2;i<N;i++)        if(eul[i]==i)           for(long long j=i;j<N;j+=i)              eul[j]=eul[j]/i*(i-1);}





eg:

POJ2407 Relatives

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

题意:

求欧拉函数。

思路:

测试模版用

code:

#define N 112345long long  n,m;long long euler(long long n){     long long res=n,a=n;     for(long long i=2;i*i<=a;i++)         if(a%i==0)         {             res=res/i*(i-1);             while(a%i==0) a/=i;         }     if(a>1) res=res/a*(a-1);     return res;}long long eul[N];void init(){     eul[1]=1;     for(long long i=2;i<N;i++)       eul[i]=i;     for(long long i=2;i<N;i++)        if(eul[i]==i)           for(long long j=i;j<N;j+=i)              eul[j]=eul[j]/i*(i-1);}int main(){    int i,j,k,kk,t,x,y,z;//    init();    while(scanf("%lld",&n)!=EOF&&n)    {        printf("%lld\n",euler(n));    }    return 0;}





0 0
原创粉丝点击