Analysis
这道题用到了正整数的唯一分解定理。把给定的K,n表示成p1^a1*p2^a2……的形式,然后如果对于每一个质因数p,若它在K中的次数不超过m倍的在n中的次数,那么就得到了k | n^m 。
Accepted Code
var
bo:array[1..10000] of boolean;
prime,kp,tmpp:array[0..10000] of longint;
i,j,prinum,tmp,n,m,k,ans,max,maxt:longint;
boo:boolean;
begin
readln(n,m,k);
fillchar(bo,sizeof(bo),true);
bo[1]:=false;
for i:=2 to 10000 do
begin
if not bo[i] then
continue;
j:=2;
while i*j<=10000 do
begin
bo[i*j]:=false;
inc(j);
end;
end;
j:=0;
for i:=1 to 10000 do
if bo[i] then
begin
inc(j);
prime[j]:=i;
end;
prinum:=j;
fillchar(kp,sizeof(kp),0);
for i:=1 to prinum do
begin
while k mod prime[i]=0 do
begin
inc(kp[i]);
k:=k div prime[i];
end;
if k=1 then
begin
max:=i;
break;
end;
end;
ans:=0;
for j:=1 to n do
begin
fillchar(tmpp,sizeof(tmpp),0);
read(tmp);
for i:=1 to prinum do
begin
while tmp mod prime[i]=0 do
begin
inc(tmpp[i]);
tmp:=tmp div prime[i];
end;
if tmp=1 then
begin
maxt:=i;
break;
end;
end;
if max>maxt then
continue
else
begin
boo:=true;
for i:=1 to max do
if kp[i]>0 then
boo:=boo and (tmpp[i]*m>=kp[i]);
if boo then
inc(ans);
end;
end;
writeln(ans);
end.