ccc
2025-04-17 13:23:29
发布于:广东
#include<iostream>
#include<vector>
#include<map>
#include<bitset>
using namespace std;
#define ll long long
const ll MAXFOR=1e6;
const ll MAXN=MAXFOR+16;
const ll INF=0x7fffffff;
ll n,ma,mb,s,add,ans=INF;
bool can;
vector<ll> prm;
map<ll,ll> mpa,mpb;
bitset<MAXN> bst;
int main(){
bst.set(0);bst.set(1);
for(ll i=2;i<=MAXFOR;i++){
if(!bst[i]) prm.push_back(i);
for(ll j=0;j<prm.size();j++){
if(iprm[j]>MAXFOR) break;
bst.set(iprm[j]);
if(i%prm[j]0) break;
}
}
cin>>n>>ma>>mb;
if(ma1){
cout<<0;
return 0;
}
for(ll i=0;i<prm.size();i++){
if(prm[i]>ma) break;
while(ma%prm[i]0){
mpa[prm[i]]+=mb;
ma/=prm[i];
}
}
for(ll i=1;i<=n;i++){
cin>>s;
add=1;
mpb.clear();
for(ll j=0;j<prm.size();j++){
if(prm[j]>s) break;
while(s%prm[j]0){
mpb[prm[j]];
s/=prm[j];
}
}
can=true;
for(ll j=0;j<prm.size();j){
auto ita=mpa.find(prm[j]);
auto itb=mpb.find(prm[j]);
if(ita!=mpa.end()&&itb!=mpb.end()){
if(ita->second<=itb->second) continue;
if(ita->second%itb->second) add=max(ita->second/itb->second+1,add);
else add=max(ita->second/itb->second,add);
}
else if(ita!=mpa.end()&&itbmpb.end()){
can=false;
break;
}
}
if(!can) continue;
ans=min(add,ans);
}
if(ansINF) cout<<-1;
else cout<<ans;
return 0;
}
这里空空如也
有帮助,赞一个