题目描述:
117. Counting
time limit per test: 0.5 sec.
memory limit per test: 4096 KB
Find amount of numbers for given sequence of integer numbers such that after raising them to the M-th power they will be divided by K.
Input
Input consists of two lines. There are three integer numbers N, M, K (0<N, M, K<10001) on the first line. There are N positive integer numbers − given sequence (each number is not more than 10001) − on the second line.
Output
Write answer for given task.
Sample Input
4 2 50
9 10 11 12
Sample Output
1
思路:
统计K的每个质因子的个数。
然后对进来的每个N做判断。
累加符合条件个数。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<set>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<map>
#define inf 0xfffffff
#define CLR(a,b) memset((a),(b),sizeof((a)))
using namespace std;
int const nMax = 40000;
typedef int LL;
typedef pair<LL,LL> pij;
map<int ,int > hash;
int n,m,k;
int p[200];
int main(){
cin>>n>>m>>k;
int ans=0;
int l=0;
if(k==1){
printf("%d\n",n);
return 0;
}
for(int i=2;i<=k;i++)if(k%i==0){
p[l++]=i;
hash[i]=0;
while(k%i==0){
hash[i]=hash[i]+1;
k/=i;
}
}
for(int i=0;i<n;i++){
cin>>k;
if(k==0){
ans++;
continue;
}
bool ok=true;
for(int j=0;j<l;j++)if(k%p[j]==0){
int a=0;
while(k%p[j]==0){
k/=p[j];
a++;
}
if(a*m<hash[p[j]]){
ok=false;
break;
}
}else {
ok=false;
break;
}
if(ok)ans++;
}
printf("%d\n",ans);
return 0;
}