也是用新学的map写出来了
2025-08-12 12:11:52
发布于:浙江
#include<bits/stdc++.h>
using namespace std;
int N;
int m1,m2;
int s[50005];
int ans=1e8;
map<int,int> m;
int main(){
cin>>N>>m1>>m2;
for(int i=1;i<=N;i++){
cin>>s[i];
}
int cnt=2;
if(m11){
cout<<0;
return 0;
}
while(m1>1){
if(m1%cnt0){
m[cnt]+=m2;
m1/=cnt;
}else{
cnt++;
}
}
/for(map<int,int>::iterator it=m.begin();it!=m.end();it++){
cout<<it->first<<" "<<it->second<<endl;
}/
for(int i=1;i<=N;i++){
map<int,int> n;//当前质因数
map<int,int> n2;//初始质因数个数
int cnt=2;
while(s[i]>1){
if(s[i]%cnt==0){
n[cnt];
n2[cnt];
s[i]/=cnt;
}else{
cnt++;
}
}
bool ok=1;//判断是否是倍数
int jans=1;//记录局部答案
for(map<int,int>::iterator it=m.begin();it!=m.end();it++){
if(n[it->first]==0){
ok=0;
break;
}else{
if(n[it->first]>=it->second){
continue ;
}else{
if((n[it->first]-it->second)%n2[it->first]0){
int t=(int)(it->second-n[it->first])/n2[it->first];
jans+=t;
for(map<int,int>::iterator itt=n.begin();itt!=n.end();itt++){
itt->second+=n2[itt->first]*t;
}
//cout<<t<<endl;
}
else{
int t=(int)(it->second-n[it->first])/n2[it->first]+1;
jans+=t;
for(map<int,int>::iterator itt=n.begin();itt!=n.end();itt++){
itt->second+=n2[itt->first]*t;
}
//cout<<t<<endl;
}
/for(auto i:n){
cout<<i.second<<" ";
}
cout<<endl;/
}
}
}
//cout<<jans<<endl;
if(ok){
ans=min(ans,jans);
}
}
if(ans1e8){
cout<<-1;
}else{
cout<<ans;
}
}
这里空空如也
有帮助,赞一个