模拟/sgu 117 Index of super-prime
题意
给出n,m,k
接下来有n个数ai,求这些数中有多少个ai*m能被k整除
输出个数
分析
首先将k分解质因数,p[i]存的是第i个因子,num[p[i]]表示p[i]这个因子有多少个
将ai*m分解质因数,如果ai*m的质因数中,没有某个p[i],或质因数中某个p[i]的个数少于k中p[i]的个数(即num[p[i]]),那么,这个数就不符合要求
只有这个数的质因数包含了所有p[i],并且每个p[i]都至少有num[p[i]]个,则这个数是可以的,答案+1
在处理这道题上,我们可以1~len(k的质因数个数)循环,对每个数now进行计算,如果当前的num[p[i]]>t*m,则不可以。这样就不需要把每个now分解质因数再查找了
Accepted Code
1 { 2 PROBLEM:sgu117 3 AUTHER:Rinyo 4 MEMO:分解质因数 5 } 6 Program sgu117; 7 Var 8 flag:Boolean; 9 n,m,k,t,now,i,j,len,ans:Longint; 10 p,num:Array[0..40000]Of Longint; 11 Begin 12 ReadLn(n,m,k); 13 If k=1 Then Begin 14 WriteLn(n); 15 halt; 16 End; 17 For i:=2 To k Do 18 If (k Mod i=0) Then Begin 19 Inc(len); 20 p[len]:=i; 21 While (k Mod i=0) Do Begin 22 Inc(num[i]); 23 k:=k Div i; 24 End; 25 End; 26 For i:=1 To n Do Begin 27 Read(now); 28 If now=0 then Begin 29 Inc(ans); 30 Continue; 31 End; 32 flag:=true; 33 For j:=1 To len Do 34 If now Mod p[j]=0 Then Begin 35 t:=0; 36 WHile (now Mod p[j]=0) Do Begin 37 Inc(t); 38 now:=now Div p[j]; 39 End; 40 If t*m<num[p[j]] Then Begin 41 flag:=false; 42 break; 43 End; 44 End Else Begin 45 flag:=false; 46 break; 47 ENd; 48 If flag Then Inc(ans); 49 End; 50 WriteLn(ans); 51 End.