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