【模版】欧拉函数
参考网址:
https://blog.csdn.net/ydd97/article/details/47805419
https://blog.csdn.net/zxwsbg/article/details/81488956
https://blog.csdn.net/sentimental_dog/article/details/52002608
前语
欧拉函数的通项公式:φ(n)=n*(1-1/p1)*(1-1/p2)*(1-1/p3)*(1-1/p4)...(1-1/pn)
欧拉函数用希腊字母φ表示,φ(N)表示N的欧拉函数.
对φ(N)的值,可以通俗地理解为小于N且与N互质的数的个数(包含1).
代码
#include <iostream>
#include <cstdio>
using namespace std;
#define MaxSize 100010
int E[MaxSize];
int plain_euler(int n){
int ans = n;
for (int i = 2; i*i <= n; i++){
if (n%i == 0){
ans -= ans/i; //等价于通项,把n乘进去
while (n%i == 0) n /= i; //确保下一个i是n的素因数
}
}
if (n > 1) ans -= ans/n; //最后可能还剩下一个素因数没有除
return ans;
}
void euler(int maxn){
E[1] = 1;
for (int i = 2; i < maxn; i++) E[i] = i;
for (int i = 2; i < maxn; i++){
if (E[i] == i){
for (int j = i; j < maxn; j += i) //↓↓↓目前并不懂是什么意思↓↓↓
E[j] = E[j]/i*(i-1); //先进行除法是为了防止中间数据的溢出
}
}
}
int main() {
int n;
scanf("%d", &n); //求n以内与n互质的正整数(包括1)
euler(n+1); //边界加一以便于求E[n]
printf("%d\n", E[n]);
int ans = plain_euler(n); //直接返回n以内与n互质的正整数(包括1)
printf("%d\n", ans);
return 0;
}