欧拉函数

数论里的一个小定理,没什么特别的,就是求[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;
}


posted @ 2016-11-01 14:40  seasonal  阅读(95)  评论(0编辑  收藏  举报