简单的数论题。
对于任意一个实数 M , 它可以表示成一些素数幂次的积,即:
P 为素数, 因此, 若 N的M次方能够整除K,则N的素数幂次乘以M后,均不小于K的素数幂次。
难度系数:☆☆☆☆☆
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<cmath>
#include<map>
#include<time.h>
using namespace std;
const int M=1000003;
const int N=11100;
const int inf=1<<29;
//const double inf=1000000000000000000LL;
const double eps=1e-12;
const double pi=acos(-1.0);
int n,m,k;
int p[N],cnt[N],cnt1[N];
bool prime[N];
int num;
void build()
{
num=0;
for(int i=2;i<10010;i++)
{
if(!prime[i]) p[num++]=i;
for(int j=0;(j<num && i*p[j]<10010);j++)
{
prime[i*p[j]]=1;
if(!(i%p[j])) break;
}
}
}
int main()
{
build();
while(scanf("%d%d%d",&n,&m,&k)==3)
{
int a;
int tot=0;
memset(cnt,0,sizeof(cnt));
memset(cnt1,0,sizeof(cnt1));
int d=0;
int ans=0;
for(int i=0;k>=p[i] && i<num;i++)
{
if(k%p[i]==0)
{
cnt[d]=p[i];
int l=k;
while(l%p[i]==0)
{
l/=p[i];
cnt1[d]++;
}
d++;
}
}
while(n--)
{
scanf("%d",&a);
bool flag=true;
for(int i=0;i<d;i++)
{
if(a%cnt[i]!=0)
{
flag=false;break;
}
else
{
int cntl=0;
int l=a;
while(l%cnt[i]==0)
{
l/=cnt[i];
cntl++;
}
if(cntl*m<cnt1[i])
{
flag=false;break;
}
}
}
if(flag) ans++;
}
printf("%d\n",ans);
}
return 0;
}