素数 euler

来源:互联网 发布:如何编译linux内核 编辑:程序博客网 时间:2024/06/04 19:59
///素数打表void getprime(){    memset(prime,0,sizeof(prime));    for(int i=2;i<=maxn;i++)    {        if(!prime[i]) prime[flag++]=i;        for(int j=1;j<flag;j++)        {            if(i*prime[j]>=maxn) break;            prime[i*prime[j]]=1;            if(i%prime[j]==0) break;        }    }}///单个数的欧拉函数值,结合素数表进行运动int ac(int  n){    int ans=n;    if(n==1) return 0;    for(int i=1;i<flag&&prime[i]<=n;i++)    {        if(n%prime[i]==0)        {            ans=ans/prime[i]*(prime[i]-1);            while(n%prime[i]==0) n/=prime[i];        }    }    if(n>1) ans=ans/n*(n-1);    return ans;}///单独的求某个数的欧拉函数值int ac(int n){    int ans=n;    for(int i=2;i<=sqrt(n);i++)    {        if(n%i==0)        {            ans=ans/i*(i-1);            while(n%i==0) n/=i;        }    }    if(n>1) ans=ans/n*(n-1);    return ans;}///欧拉函数值的打表void getphi(){    memset(phi,0,sizeof(phi));    phi[1]=1;    for(int i=2;i<=maxn;i++)    {        if(!phi[i])        {            for(int j=i;j<=maxn;j+=i)            {                if(!phi[j]) phi[j]=j;                phi[j]=phi[j]/i*(i-1);            }        }    }}