求助:代码60分,Subtask #5 后三个点TLE
#include <bits/stdc++.h>
using namespace std;
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define ll long long
const int MAXN = 5e5+10;
const int INF = 0x3f3f3f3f;
int a[MAXN],b[MAXN];
int n,m,c,up,cnt;
int tmp;
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
int dp[MAXN];
void init(){
sort(b+1,b+1+m);
unique(b+1,b+1+m)-b-1;// start from 1,unique(1,1+m) - b = m+1,wee need to sub it;
for(int i = 0;i <= up;i++){
dp[i] = INF;
}
dp[1] = 0;
#define k j*b[i]
for(int i = 1;i <= m;i++){
for(int j = 1;k <= up;j++){
dp[k] = min(dp[k],dp[j]+1);
}
}
#undef k
}
int ans = INF;
void solve(){
for(int i = 1;i * i <= c;i++){
if(c % i == 0){
int s = 0;
for(int j = 1;j <= n;j++) {
if(dp[a[j]/i] == INF) {s = INF;break;}
s += dp[a[j]/i];
}
ans = min(ans, s);
s = 0;
for(int j = 1;j <= n;j++) {
if(dp[a[j]/(c/i)] == INF) {s = INF;break;}
s += dp[a[j]/(c/i)];
}
ans = min(ans, s);
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i = 1;i <= n;i++) scanf("%d",&a[i]),up = max(up,a[i]),c = gcd(a[i],c);
for(int i = 1;i <= m;i++){
scanf("%d",&tmp);
if(tmp != 1){
b[++cnt] = tmp,up = max(up,tmp);
}
}
m = cnt;
init();
solve();
printf("%d",(ans == INF?-1:ans));
return 0;
}
THANKS