函数:
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:
拓展欧拉定理,还没写,嗯
博客介绍了欧拉函数的计算方法,包括直接计算函数`intEuler(int x)`和线性筛法`voidEulers(int n)`。线性筛法用于优化大量质数欧拉函数的求解,通过维护一个质数表和欧拉函数表来高效计算。博客还提及了几道相关的编程题目,如洛谷上的仪仗队问题和GCD问题等。
935

被折叠的 条评论
为什么被折叠?



