​传送门​

题目大意

Codeforces 687 B_分解质因数是长度为Codeforces 687 B_i++_02的序列,问Codeforces 687 B_i++_03是否为0,是输出Codeforces 687 B_分解质因数_04,不是输出Codeforces 687 B_质因数_05

思路

分解质因数法求出Codeforces 687 B_i++_06,将Codeforces 687 B_质因数_07分解质因数,只要Codeforces 687 B_质因数_07质因数的幂次都小于等于Codeforces 687 B_i++_06中的幂次,就是Codeforces 687 B_分解质因数_04

代码

bool vis[maxn];//标记非素数,0是素数
int primer[maxn/10];//存素数
int cnt=0;//记录素数个数,
void find_primer(){
for(int i=2;i <=maxn;i++){
if(!vis[i])primer[cnt++]=i;
for(int j=0;j<cnt&&primer[j]*i<=maxn;j++){
vis[i*primer[j]]=1;//筛
if(i%primer[j]==0)break;//关键!!!找到i*primer[j]的最小质因子primer[j],退出
}
}
}
map<int,int>mp;
void init(int x){
for(int i=0;primer[i]*primer[i]<=x;i++){
if(x%primer[i]==0){
int cnt1=0;
while(x%primer[i]==0){
cnt1++;
x/=primer[i];
}
mp[primer[i]]=max(mp[primer[i]],cnt1);
}
}
if(x>1)mp[x]=max(mp[x],1);
}

int main(){
scanf("%d%d",&n,&k);
find_primer();
for(int i=1;i<=n;i++){
scanf("%d",&c[i]);
init(c[i]);
}
int flag=1;
for(int i=0;primer[i]*primer[i]<=k&&i<cnt;i++){
if(k%primer[i]==0){
int cnt1=0;
while(k%primer[i]==0){
k/=primer[i];
cnt1++;
}
if(mp[primer[i]]<cnt1){
flag=0;
break;
}
}
}
if(k>1){
if(mp[k]<1){
flag=0;
}
}
if(flag){
puts("Yes");
}
else{
puts("No");
}
}