φ函数的值 通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数,x是不为0的整数。φ(1)=1(唯一和1互质的数就是1本身)。 (注意:每种质因数只一个。比如12=2*2*3
那么φ(12)=12*(1-1/2)*(1-1/3)=4)
若n是质数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因为除了p的倍数外,其他数都跟n互质。
设n为正整数,以 φ(n)表示不超过n且与n互
素的正整数的个数,称为n的欧拉函数值,这里函数
φ:N→N,n→φ(n)称为欧拉函数。
欧拉函数是积性函数——若m,n互质,φ(mn)=φ(m)φ(n)。
特殊性质:当n为奇数时,φ(2n)=φ(n), 证明与上述类似。
这道题就是赤裸裸的欧拉函数,直接套公式即可
program poj2407;
const
max=31623;
var
a:array[1..max] of longint;
n,len:longint;
ans:real;
function check(num:longint):boolean;
var
i,j:longint;
begin
for i:=1 to len do
if a[i]<=trunc(sqrt(num))+1 then
begin
if num mod a[i]=0 then
begin
check:=false;
exit;
end;
end;
check:=true;
end;
procedure first;
var
k:longint;
begin
a[1]:=2;
len:=1;
for k:=3 to max do
if check(k) then
begin
inc(len);
a[len]:=k;
end;
end;
function f(num:longint):real;
var
i:longint;
sum:real;
begin
sum:=n;
for i:=1 to len do
if (a[i]<=trunc(sqrt(num))+1) and (num>1) then
begin
if num mod a[i]=0 then
begin
while (num mod a[i]=0) and (num>1) do num:=num div a[i];
sum:=sum*(1-1/a[i]);
end;
end
else break;
if num>1 then sum:=sum*(1-1/num);
f:=sum;
end;
begin
first;
readln(n);
while n<>0 do
begin
ans:=f(n);
writeln(ans:0:0);
readln(n);
end;
end.