Relatives
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 13044 | Accepted: 6464 |
Description
Given n, a positive integer, how many positive integers less than n are relatively prime to n? Two integers a and b are relatively prime if there are no integers x > 1, y > 0, z > 0 such that a = xy and b = xz.
Input
There are several test cases. For each test case, standard input contains a line with n <= 1,000,000,000. A line containing 0 follows the last case.
Output
For each test case there should be single line of output answering the question posed above.
Sample Input
7 12 0
Sample Output
6 4
Source
对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。例如euler(8)=4,因为1,3,5,7均和8互质。
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的整数。
(注意:每种质因数只一个。比如 12 = 2*2*3 那么 φ(12) = 12 * (1-1/2) * (1-1/3)=4 )
euler(1)=1(唯一和1互质的数(小于等于)就是1本身)。
欧拉函数性质: 1、 φ(mn) = φ(m) φ(n)
2、若n为奇数,φ(2n) = φ(n)。
欧拉公式的延伸:一个数的所有质因子之和是euler(n)*n/2。
注意:在欧拉函数中,函数值是 [ 1 , n ] 中与 n 互质数个数
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int ac(int n)
{
int res=n;
int a=n;
for(int i=2;i*i<=n;i++)
{
if(a%i==0)
{
res=res/i*(i-1);
while(a%i==0)
a/=i;
}
}
if(a>1)
res=res/a*(a-1);
return res;
}
int main()
{
int n;
while(scanf("%d",&n),n)
{
int ans=ac(n);
printf("%d\n",ans);
}
return 0;
}