模板——欧拉函数
欧拉函数 H(x)表示小于n与n互质的数的个数。
H(x)=x(1-1/P1)(1-1/P2)…(1/Pn)
P1,P2…Pn为x的素数因子
先引入一个例题吧
计蒜客——蓝桥杯模拟——欧拉函数
这是一个填写代码的题:
#include <stdio.h>
int euler(int n) {
int res = n;
for (int i = 2; i <= n; i++) {
if (n % i == 0) {
res = res / i * (i-1);/*这一行是你需要填写的代码*/
while (n % i == 0) {
n /= i;
}
}
}
return res;
}
int main(void) {
int n;
scanf("%d", &n);
printf("%d\n", euler(n));
return 0;
}
不局限于这个题,可以看一下用sqrt函数的解法
缩小了一点范围而已。
sqrt函数(注意数据类型要用double 或者float哦):
#include<stdio.h>
#include<math.h>
int main()
{
double n,m;
n=16;
m=sqrt(n);
printf("%.lf",m);
return 0;
}
代码:
#include <stdio.h>
#include <math.h>
int euler(int n) {
int res = n;
for (int i = 2; i <= sqrt(n); i++) {
if (n % i == 0) {
res = res / i * (i-1);
while (n % i == 0) {
n /= i;
}
}
}
if(n != 1) res=res-res/n;
return res;
}
int main(void) {
int n;
scanf("%d", &n);
printf("%d\n", euler(n));
return 0;
}
然后我们抛开这个题看一下欧拉公式
引用一个大佬的博客
点击我!我是传送门
还有就是欧拉函数的一些性质。
大致就是这些:
- H(1)=1,除了2以外,H(n)都是偶数
- 小于n与n互质的所有数的和为 H(n)*n/2
- p为素数,H(pk)=pk-p^(k-1).
- H(p)=p-1。
- 如果m和n互素,即GCD(m, n) = 1,那么H(m * n) = H(m) * H(n)
ps:反正我也记不住。