【NOIP2016练习】T2 跑跑步 (数论)

这场的难度是从高到低的

 1 var a:array[1..100]of longint;
 2     n,m,i,ans:longint;
 3 
 4 function gcd(x,y:longint):longint;
 5 var r:longint;
 6 begin
 7  repeat
 8   r:=x mod y;
 9   x:=y;
10   y:=r;
11  until r=0;
12  exit(x);
13 end;
14 
15 function fi(x:longint):longint;
16 var i:longint;
17 begin
18  fi:=x;
19  for i:=2 to trunc(sqrt(x)) do
20   if x mod i=0 then
21   begin
22    fi:=fi div i*(i-1);
23    while x mod i=0 do x:=x div i;
24   end;
25  if x>1 then fi:=fi div x*(x-1);
26 end;
27 
28 function clac(x:longint):longint;
29 var i:longint;
30 begin
31  for i:=1 to m do
32   if x mod gcd(n,a[i])=0 then exit(fi(n div x));
33  exit(0);
34 end;
35 
36 begin
37  assign(input,'1.in'); reset(input);
38  assign(output,'1.out'); rewrite(output);
39  readln(n,m);
40  for i:=1 to m do read(a[i]);
41  for i:=1 to trunc(sqrt(n)) do
42   if n mod i=0 then
43   begin
44    ans:=ans+clac(i);
45    if i*i<>n then ans:=ans+clac(n div i);
46   end;
47  writeln(n-ans);
48 
49  close(input);
50  close(output);
51 end.

 

posted on 2016-10-30 20:51  myx12345  阅读(225)  评论(0编辑  收藏  举报

导航