poj 2407 Relatives

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


解题思路:

   欧拉函数模版

   欧拉函数简易证明:

第一种情况如果n=1,则 φ(1) = 1 。因为1与任何数(包括自身)都构成互质关系。

第二种情况如果n是质数,则 φ(n)=n-1 。因为质数与小于它的每一个数,都构成互质关系。比如5与1、2、3、4都构成互质关系。
第三种情况如果n是质数的某一个次方,即 n = p^k (p为质数,k为大于等于1的整数),这是因为只有当一个数不包含质数p,才可能与n互质。而包含质数p的数一共有p^(k-1)个,即1×p、2×p、3×p、...、p^(k-1)×p,把它们去除,剩下的就是与n互质的数。

        第四种情况如果n可以分解成两个互质的整数之积,n = p1 × p2则φ(n) = φ(p1p2) = φ(p1)φ(p2)即积的欧拉函数等于各个因子的欧拉函数之积。比如,φ(56)=φ(8×7)=φ(8)×φ(7)=4×6=24。

    转至http://blog.csdn.net/paxhujing/article/details/51353672


代码:

var
  n:longint;


function phi(n:longint):longint;
var
  i,j,ans,m:longint;
begin
  if n=1 then exit(0);
  ans:=n;
  m:=trunc(sqrt(n));
  for i:=2 to m do
    if(n mod i=0)
      then begin
             ans:=ans div i*(i-1);
             while(n mod i=0)do n:=n div i;
           end;
  if(n>1) then ans:=ans div n*(n-1);
  exit(ans);
end;


begin
  while 1<2 do
    begin
      readln(n);
      if n=0 then break;
      writeln(phi(n));
    end;
end.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值