欧拉函数的线性筛法

欧拉函数:对正整数n,欧拉函数是小于等于n的数中与n互质的数的数目。
欧拉函数又称为φ函数。
下面是欧拉函数的一些性质:
如果n为某一个素数p,则φ(p)=p-1;
如果n为某一个素数p的幂次 pa ,则φ( pa )=(p-1)* p(a1)
如果n为任意两个互质的数a,b的积,则:φ(a*b)=φ(a)*φ(b);


如果p为质数。
如果i mod p =0,那么φ(i*p)=φ(i)*p;
如果i mod p ≠0,那么φ(i*p)=φ(i)*(p-1);


代码实现

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=10000;
int phi[N+10],prime[N+10],tot,ans;
bool vis[N+10];
void getphi()
{
    int i,j;
    phi[1]=1;
    for(i=2;i<=N;i++)
    {
        if(!vis[i])
        {
            prime[++tot]=i;
            phi[i]=i-1;
        }
        for(j=1;j<=tot;j++)
        {
            if(i*prime[j]>N)break;
            vis[i*prime[j]]=true;
            if(i%prime[j]==0)
            {
                phi[i*prime[j]]=phi[i]*prime[j];
                break;
            }
            else
            {
                phi[i*prime[j]]=phi[i]*(prime[j]-1);
            }
        }
    }
}
int main()
{
    getphi();
    int n;
    while(~scanf("%d",&n))
    {
        printf("%d\n",phi[n]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/pandauncle/article/details/79572066