关于两个版本的欧拉函数
查看原帖
关于两个版本的欧拉函数
815093
AAAAAZBX楼主2023/5/27 00:26

两个版本的欧拉函数,上面比较长的那个没过测试点,下面那个短的过了,但是在编译时间上(不是这个题,是另外一个题)长的那个代码更快,有没有大佬能告诉我这两个欧拉函数的代码有什么区别,什么时候该用哪个

第一个版本的欧拉函数

void get_eulers(int n) {
	phi[1] = 1;
    for (int i = 2; i <= n; i++)
    {
        if (!st[i])
        {
            primes[cnt++] = i;
            phi[i] = i - 1;
        }
        for (int j = 0; primes[j] <= n / i; j++)
        {
            st[primes[j] * i] = 1;
            if (i % primes[j] == 0)
            {
                phi[i*primes[j]] = primes[j] * phi[i];
                break;
            }
            phi[primes[j] * i] = phi[i] * (primes[j] - 1);
        }
    }
}

第二个版本的欧拉函数

void get_eulers2(int n) {
    phi[1] = 1;
    for (int i = 2; i <= n; i++)
        if (!phi[i])
            for (int j = i; j <= n; j += i) {
                if (!phi[j]) phi[j] = j;
                phi[j] = phi[j] / i * (i - 1);
            }
}
2023/5/27 00:26
加载中...