2013-team4/code/euler-function

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

{{{
//复杂度O(sqrt(x)),欧拉函数φ(x)为1到x中与x互质数的个数。φ(1)=1
int euler(int x)
{
    int res = x;
    for(int i = 2; i * i <= x; i++){
        if(x % i == 0){
            res -= res / i;
            while(x % i == 0)x /= i;
        }
    }
    if(x > 1)res -= res / x;
    return res;
}
}}}
{{{
//筛法,求MAXN以内的欧拉函数,O(nlogn)
#define MAXN 100020
int f[MAXN];
bool vis[MAXN];
void init_euler(){
    for(int i = 0; i < MAXN; i++)f[i] = i;
    for(int i = 2; i < MAXN; i++){
        if(!vis[i]){
            for(int j = i; j < MAXN; j+=i){
                f[j] -= f[j] / i;
                vis[j] = true;
            }
        }
    }
}
}}}
//复杂度O(sqrt(x)),欧拉函数φ(x)为1到x中与x互质数的个数。φ(1)=1
int euler(int x)
{
    int res = x;
    for(int i = 2; i * i <= x; i++){
        if(x % i == 0){
            res -= res / i;
            while(x % i == 0)x /= i;
        }
    }
    if(x > 1)res -= res / x;
    return res;
}
//筛法,求MAXN以内的欧拉函数,O(nlogn)
#define MAXN 100020
int f[MAXN];
bool vis[MAXN];
void init_euler(){
    for(int i = 0; i < MAXN; i++)f[i] = i;
    for(int i = 2; i < MAXN; i++){
        if(!vis[i]){
            for(int j = i; j < MAXN; j+=i){
                f[j] -= f[j] / i;
                vis[j] = true;
            }
        }
    }
}