Submission #1338252

#TimeUsernameProblemLanguageResultExecution timeMemory
1338252Born_To_LaughBrunhilda’s Birthday (BOI13_brunhilda)C++17
5.56 / 100
1104 ms235328 KiB
// Born_To_Laugh - Hughie Do
#include <bits/stdc++.h>
#define alle(AC) AC.begin(), AC.end()
#define fi first
#define se second
using namespace std;
typedef long long ll;
[[maybe_unused]] const ll MOD = 998244353, INF = 1e9 + 7;

const ll maxn = 1e7 + 10;
int isprime[maxn];
inline void sieve(){
    int n = maxn - 1;
    for(int i=1; i<=n; ++i) isprime[i] = i;
    for(int i=2; i * i <= n; ++i){
        if(isprime[i] == i){
            for(int j = i * i; j<=n; j += i) isprime[j] = i;
        }
    }
}
class SEGTREE
{
    private:
        int n;
        vector<int> tree;
        inline void upd(int id, int l, int r, int pos, int val){
            if(l == r){
                tree[id] = min(tree[id], val);
                return;
            }
            int mid = (l + r) >> 1;
            if(pos <= mid) upd(id << 1, l, mid, pos, val);
            else upd(id << 1|1, mid + 1, r, pos, val);
            tree[id] = min(tree[id << 1], tree[id << 1|1]);
        }
        inline int qr(int id, int l, int r, int lo, int hi){
            if(l > hi || r < lo) return INF;
            else if(l >= lo && r <= hi) return tree[id];
            int mid = (l + r) >> 1;
            return min(qr(id << 1, l, mid, lo, hi), qr(id << 1|1, mid + 1, r, lo, hi));
        }
    public:
        inline void init(int len){
            n = len;
            tree.assign(n << 2, INF);
        }
        inline void upd(int pos, int val){
            upd(1, 0, n, pos, val);
        }
        inline int qr(int lo, int hi){
            return qr(1, 0, n, lo, hi);
        }
};
inline ll lcm(int a, int b){
    return (ll)a * b / gcd(a, b);
}

int m, q;
set<int> s;
SEGTREE st;
ll lcma = 1;
int dp[maxn];
int suff[maxn];

void solve(){
    cin >> m >> q;
    for(int i=1; i<=m; ++i){
        int x;cin >> x;
        s.insert(x);
        if(lcma < maxn) lcma = lcm(lcma, x);
    }
    sieve();

    st.init(maxn - 1);
    st.upd(0, 0);

    for(int i=1; i<=min(maxn - 1, lcma); ++i){
        dp[i] = INF;
        int x = i + 1;
        int num = -1;
        while(x != 1){
            if(s.find(isprime[x]) != s.end()){
                num = max(num, isprime[x]);
            }
            x /= isprime[x];
        }
        if(num == -1) continue;
        dp[i] = min(dp[i], st.qr(i + 1 - num, i - 1) + 1);
        st.upd(i, dp[i]);
    }
    // for(int i=1; i<=min(maxn - 1, lcma); ++i) cout << dp[i] << ' ';
    // cout << '\n';

    suff[min(maxn - 1, lcma)] = dp[min(maxn - 1, lcma)];
    for(int i=min(maxn - 2, lcma - 1); i>=1; --i){
        suff[i] = min(int(dp[i] == 0 ? INF : dp[i]), suff[i + 1]);
    }
    while(q--){
        int x;cin >> x;
        if(x >= lcma || suff[x] >= INF) cout << "oo\n";
        else cout << suff[x] << '\n';
    }
}
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...