SGU 117 解题手记
题目大意:给出一串正整数(<10001),求其中M 次幂能被K 整除的数字的个数。
Input:N M K (0<N, M, K<10001) (N 个正整数)
Output:其中M 次幂能被K 整除的数字的个数。
将K 分解质因数,写成
的形式。再将N 个正整数也分解质因数,写成
的形式,如果
对应地大于等于
,那么这个整数的M 次幂就可以被K 整除。
K 的质因数不会超过8 个,因为8!>10000。将K 分解质因数时,只需要100 以下的质数表,因为K 最多只有一个大于100 的质因数,而这个数在将K 分解到最后时就自然得到了。100 以下的质数有25 个。
将待检测的N 个整数分解质因数时,直接拿K 的质因数分解结果作质数表就可以了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | //AC #include <iostream> using namespace std; void getprimes(long *primes) { for (long i=2;i<100;++i) { bool prime(true); for (long j=1,*jprimes=primes+1;j<=*primes;++j,++jprimes) if ((*jprimes)*(*jprimes)>i) break; else if (i%(*jprimes)==0) { prime=false; break; } if (prime) { ++(*primes); *(primes+(*primes))=i; } } } void get_kprimes(long *primes,long k,long *kprimes,long *power) { for (long i=1,*iprimes=primes+1;i<=*primes;++i,++iprimes) if (k%(*iprimes)==0) { *(kprimes+(++*kprimes))=*iprimes; *(power+(++*power))=0; while (k%(*iprimes)==0) { ++*(power+(*power)); k/=*iprimes; } } if (k>1) { *(kprimes+(++*kprimes))=k; *(power+(++*power))=1; } } void get_npower(long *kprimes,long n,long *power) { for (long i=1,*iprimes=kprimes+1;i<=*kprimes;++i,++iprimes) { *(power+(++*power))=0; while (n%(*iprimes)==0) { ++*(power+(*power)); n/=*iprimes; } } } int main() { long primes[100]={0}; long kprimes[10]={0},kpower[10]={0},npower[10]={0}; long n,m,k,c,result(0); getprimes(primes); cin>>n>>m>>k; get_kprimes(primes,k,kprimes,kpower); for (long i=1;i<=n;++i) { bool count(true); cin>>c; npower[0]=0; get_npower(kprimes,c,npower); for (long j=1;j<=kprimes[0];++j) if (npower[j]*m<kpower[j]) { count=false; break; } if (count) ++result; } cout<<result<<endl; return 0; } |
