P9589 「PFLOI R1」PFL 除法 题解
Unnamed114514 · · 题解
验题人题解。
讲个笑话,出题人最早打的是
然后在一阵口胡之下成了第一发正解。
如果正向求所有情况的最小次数,很难处理,于是考虑枚举每一种情况然后求这一种情况的最小次数。
考虑枚举最后所有数都变成的数
那么现在就是求
那么对于
那么问题就转化为了一个背包,如果直接背包,复杂度是
若存在
那么这个时候时间复杂度就是
讲个笑话,这个题原数据甚至不去重或者不 sort 直接 unique 都能过。
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
const int N=5e5+5;
int n,m,ans=inf,a[N],b[N],V,dp[N];
inline int get(int x){
int s=0;
for(int i=1;i<=n;++i){
if(a[i]%x)
return inf;
if(dp[a[i]/x]==inf)
return inf;
s+=dp[a[i]/x];
}
return s;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;++i)
cin>>a[i],V=max(V,a[i]);
for(int i=1;i<=m;++i)
cin>>b[i],V=max(V,b[i]);
sort(a+1,a+n+1);
sort(b+1,b+m+1);
m=unique(b+1,b+m+1)-b-1;
memset(dp,inf,sizeof(dp)),dp[1]=0;
for(int i=1;i<=m;++i)
for(int s=b[i];s<=V;s+=b[i])
dp[s]=min(dp[s],dp[s/b[i]]+1);
for(int i=1;i<=a[1]/i;++i)
if(a[1]%i==0)
ans=min({ans,get(i),get(a[1]/i)});
if(ans==inf)
ans=-1;
cout<<ans<<endl;
return 0;
}