模拟/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.

 

posted @ 2012-12-20 17:00  Rinyo  阅读(270)  评论(0编辑  收藏  举报