【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.
null