#2#9WA求调
查看原帖
#2#9WA求调
193412
Hsy23333楼主2023/10/18 22:07
#include<bits/stdc++.h>
using namespace std;
int isprm[30004];
int zs[4000],cnt=0;
bool xbx[10004];
long long zyzgs[10003][3900];//记一下每种细胞的表内i号质因子出现次数 
long long m1zyzgs[30009];
int main(){
	int n,m1,m2,t=0,tmp,f=0,x,y;
	bool ff=0;
	long long ans=1844674407370955160,mx=0,tmpmx=0;
	scanf("%d%d%d",&n,&m1,&m2);
	for(int i=2;i<=30000;i++){
		if(!isprm[i]){
			cnt++;	zs[cnt]=i;
		}
		for(int j=1;j<=cnt && i*zs[j]<=30000;j++){
			isprm[i*zs[j]]=1;
			if(i%zs[j]==0)	break;
		}
	}//筛质数表
	
	if(m1!=1)	for(int i=1;i<=cnt && zs[i]<=m1;i++){
		while(m1%zs[i]==0){
			m1zyzgs[i]++;	m1/=zs[i];
			if(m1%zs[i]){
				m1zyzgs[i]*=m2;
			}
		}
	}//分解m1 
	else	ff=1;
	
	for(int i=1;i<=n;i++){
		scanf("%d",&tmp);
		if(ff)	continue;
		if(tmp==1){
			f++;	continue;
		}
		for(int j=1;j<=cnt && zs[j]<=tmp;j++){//si中30000以上的因子没有用,不计算 
			while(tmp%zs[j]==0){
				zyzgs[i][j]++;	tmp/=zs[j];
			}
		}//分解si

		for(int j=1;j<=cnt;j++){
			tmpmx=0;
			if(m1zyzgs[j] && !zyzgs[i][j]){//若m1有某个si无的因子,记录,跳出 
				xbx[i]=1;	f++;	break;
			}
			if(zyzgs[i][j] && m1zyzgs[i]){
				tmpmx=m1zyzgs[j]/zyzgs[i][j];
				if(m1zyzgs[j]%zyzgs[i][j]!=0)	tmpmx++;
				if(tmpmx>mx)	mx=tmpmx;
			}
		}
		if(xbx[i]){
			continue;//检查m1质因子是否全在si中,若不是,则下一个 
		}
		if(mx<ans)	ans=mx;
		mx=0;
	}
	
	if(ff){
		printf("0");	return 0;
	}
	if(f==n)	printf("-1");
	else	printf("%lld",ans);
	return 0;
}
2023/10/18 22:07
加载中...