您的位置:首页 > 其它

nyoj 333-mdd的烦恼

2014-01-09 19:39 232 查看
http://acm.nyist.net/JudgeOnline/problem.php?pid=333


mdd的烦恼

时间限制:1000 ms  |  内存限制:65535 KB
难度:3

描述
今天mdd看到这么一段话:在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。此函数以其首名研究者欧拉命名,它又称为Euler's totient function、φ函数、欧拉商数等。 例如φ(8)=4,因为1,3,5,7均和8互质。于是他想用计算机实现欧拉函数的功能,但是他又不想去写,你能帮帮他吗?
ps:互质(relatively primeì)又叫互素。若N个整数的最大公因数是1,则称这N个整数互质。

输入有多组测试数据组数小于1003,

每组测试数据有一个整数n(0<n<=65535^2+1).
输出输出欧拉函数φ(n)的值。
样例输入
2
6
46


样例输出
1
2
22


利用欧拉函数和它本身不同质因数的关系,用筛法计算出某个范围内所有数的欧拉函数值。

欧拉函数和它本身不同质因数的关系:欧拉函数ψ(N)=N{∏p|N}(1-1/p)亦即:ψ(N)=



(P是数N的质因数

如:

ψ(10)=10×(1-1/2)×(1-1/5)=4;

ψ(30)=30×(1-1/2)×(1-1/3)×(1-1/5)=8;

ψ(49)=49×(1-1/7)=



=42。
#include<iostream>
using namespace std;
int oula(int n) {
int ret = 1, i;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {  //剔除所有因子
n /= i;
ret *= i - 1;
while (n % i == 0) {
n /= i;
ret *= i;//为了保持公式的n*(1-1/p)..中的n
}
}
}
if (n > 1) //本身是质数的情况
ret *= n - 1;
return ret;
}
int main() {
int n;
while (cin >> n) {
cout << oula(n) << endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: