题目传送门:
http://acm.hdu.edu.cn/showproblem.php?pid=1286
原题大意是给出一个数n,求出所有小于等于n且与n互质的整数的个数。
而欧拉函数的定义是φ(n)为对于给定正整数 n ,少于或等于n的数中与n互质的数(包括1)的数目。
欧拉函数通式:
其中p1, p2……pn为x的所有质因数,x是不为0的整数。
φ(1)=1。
性质
1.若p是质数,n=p^k,那么则有
易证在小于n的数中,只有p的整数倍与n不互质。
2.积性函数:若m,n互质,φ(mn)=φ(m)φ(n)。
3.当n为奇数时,φ(2n)=φ(n)。
4.若n为质数,φ(n)=n-1。
解题过程
从公式可以发现,φ(n)的结果与p的指数没有关系,从公式可以方便的求出结果
代码
// 欧拉函数
#include <iostream>
#include <cmath>
using namespace std;
int Euler (int n)
{
int i,sum = n;
for (i=2;i<=sqrt(n);i++) {
if (n % i == 0) {
sum = sum / i * (i-1);
while (n % i == 0) {
n /= i;
}
}
}
if (n > 1) {
sum = sum / n * (n-1);
}
return sum;
}
int main(int argc, char const *argv[])
{
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
cout << Euler(n) << endl;
}
return 0;
}
参考:
http://www.cnblogs.com/Duahanlang/archive/2013/05/02/3055454.html hdoj 1286
找新朋友 (欧拉函数) - 妮king狼 - 博客园
http://blog.csdn.net/u011514451/article/details/44946789
欧拉函数 hdoj-1286-找新朋友 - u011514451的专栏 - 博客频道 - CSDN.NET
http://baike.baidu.com/link?url=sFfYIfgSCjDO_zvKM65WtwjuEVi6lgPaB3ALKcTA2ux4PI_kuWcR0tyENqoEFLjOz12VBuEvHDz8hjhy7DJLpcL7ldBn8uDlIPwxjWZ3nN8Eu8uZNMm0aKBSq1enqu8b 百度百科 欧拉函数