90pts求调
查看原帖
90pts求调
1280967
W_12楼主2024/10/13 12:03

rt

#include <bits/stdc++.h>
using namespace std;
const int N=1e4+5;
int n,m1,m2,s[N],cnt1[3*N],cnt2[3*N];
vector<int> t;

void init(){ //对 m1 质因数分解 
	for(int i=2;i<=m1;i++){
		if(m1%i==0) t.push_back(i);
		while(m1%i==0){
			m1/=i;
			cnt1[i]++; //统计m1的质因数数量 
		}
		cnt1[i]*=m2; 
	}
}
bool check(int x){ //判断s[i]的质因数集合里是否包含m1的质因数集合
	memset(cnt2,0,sizeof cnt2);
	for(int i=0;i<t.size();i++){
		if(x%t[i]!=0) return false;
		while(x%t[i]==0){
			x/=t[i];
			cnt2[t[i]]++;
		} 
	}
	return true;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m1>>m2;
	init();
	for(int i=1;i<=n;i++) cin>>s[i];
	int minn=2e9;
	for(int i=1;i<=n;i++){
		if(!check(s[i])) continue; //没有可能作为答案
		//计算需要的分裂次数
		int maxx=-1;
		for(int j=0;j<t.size();j++){
			//计算cnt1[p[j]]变成cnt2[p[j]]所需的次数的max值
			int a=cnt1[t[j]],b=cnt2[t[j]];
			maxx=max(maxx,(a+b-1)/b);
		}
		minn=min(minn,maxx);
	}
	if(minn==2e9) cout<<-1;
	else cout<<minn;
	return 0;
}

巨佬们%%%

2024/10/13 12:03
加载中...