欧拉函数
数论里的一个小定理,没什么特别的,就是求[1~n]中与n互质的数的个数,其实还有挺多其他拓展,比如计算贡献啥的,后面再补吧。
Euler函数表达通式:euler(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn),其中p1,p2……pn为x的所有素因数,x是不为0的整数。euler(1)=1(唯一和1互质的数就是1本身)。
欧拉公式的延伸:一个数的所有质因子之和是euler(n)*n/2。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1000000;
int eular[maxn];
int Eular(int n)//直接求
{
int ans = n, now = n;
for (int i = 2; i*i <= now; i++)
{
if (now%i == 0)
{
ans = ans / i*(i - 1);
while (now%i == 0)//每种质因子只用一个,其他都除去
now /= i;
}
}
if (now > 1)//最后可能剩下一个单独的质因子
ans = ans / now*(now - 1);
return ans;
}
void init()//线性筛欧拉函数打表
{
eular[1] = 1;
for (int i = 2; i < maxn; i++)
eular[i] = i;
for (int i = 2; i < maxn; i++)
{
if (eular[i] == i)
{
for (int j = i; j < maxn; j += i)
eular[j] = eular[j] / i*(i - 1);
}
}
}
int main()
{
init();
int n;
while (scanf("%d", &n) && n)
{
printf("%d\n", eular[n]);
}
return 0;
}