函数:
int Euler(int x)
{
int ans = x;
for (int i = 2; i <= x / i; i++)
{
if (x % i == 0)
{
ans = ans /i*(i - 1);
}
while (x% i == 0)
{
x /= i;
}
}
if (x > 1)
{
ans = ans/x*(x-1);
}
return ans;
}
线性筛法:
void Eulers(int n)
{
int cnt = 0;
euler[1] = 1;//别忘了
for (int i = 2; i <= n; i++)
{
if (!st[i])
{
euler[i] = i - 1;//质数的欧拉函数就是它本身减一
prime[cnt++] = i;
}
for (int j = 0; i <= n / prime[j]; j++)//细节
{
st[i * prime[j]] = 1;
if (i % prime[j] == 0)
{
euler[i * prime[j]] = prime[j] * euler[i];
//如果==0,则i*prime[j]的欧拉函数和i的欧拉函数只差一个prime[j]
break;
}
else
{
euler[i * prime[j]] = (prime[j]-1) * euler[i];
//否则根据公式推出相差prime[j]-1
}
}
}
}
例题1:
思路:
代码不上了,推完公式很easy
例题2:
例题3:
例题4:
拓展欧拉定理,还没写,嗯