NYOJ 333

http://www.cppblog.com/RyanWang/archive/2009/07/19/90512.aspx?opt=admin

欧拉函数

E(x)表示比x小的且与x互质的正整数的个数。
*若p是素数,E(p)=p-1。
*E(pk)=pk-pk-1=(p-1)*pk-1
证:令n=pk,小于n的正整数数共有n-1即(pk-1)个,其中与p不质的数共[pk-1-1]个(分别为1*p,2*p,3*p...p(pk-1-1))。
所以E(pk)=(pk-1)-(pk-1-1)=pk-pk-1.得证。
*若ab互质,则E(a*b)=E(a)*E(b),欧拉函数是积性函数.
*对任意数n都可以唯一分解成n=p1a1*p2a2*p3a3*...*pnan(pi为素数).
则E(n)=E(p1a1)*E(p2a2)*E(p3a3)*...*E(pnan)     
      =(p1-1)*p1(a1-1)*(p2-1)*p2(a2-1)*...*(pn-1)*pn(an-1)
      =(p1a1*p2a2*p3a3*...*pnan)*[(p1-1)*(p2-1)*(p3-1)*...*(pn-1)]/(p1*p2*p3*...*pn)
      =n*(1-1/p1)*(1-1/p2)*...*(1-1/pn)

  (pi为n的素因子)

NYOJ 333  题目:

mdd的烦恼

描述
今天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

AC代码:

 1 #include<stdio.h>
 2 long long phi(long long a){
 3     long long temp=a;
 4     for(long long i=2;i*i<=a;i++){
 5         if(a%i==0){
 6             while(!(a%i))a/=i;  //去掉所有的质因子i (由i*i<=a 保证这些i都是质因子)  
 7             temp=temp/i*(i-1);  
 8         }
 9     }
10     if(a!=1) temp=temp/a*(a-1);  //考虑a为质数的情况    
11     return temp;
12 } 
13 
14 int main() {
15     long long a,b,c;
16     while(scanf("%lld",&a)!=EOF)
17         printf("%lld
",phi(a));
18     return 0;
19 }
原文地址:https://www.cnblogs.com/liugl7/p/5387490.html