求助:代码60分,Subtask #5 后三个点TLE
查看原帖
求助:代码60分,Subtask #5 后三个点TLE
324545
xiaolangwhite楼主2023/8/29 17:25

求助:代码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

2023/8/29 17:25
加载中...