제출 #1124136

#제출 시각아이디문제언어결과실행 시간메모리
1124136kustizusBrunhilda’s Birthday (BOI13_brunhilda)C++20
11.75 / 100
1105 ms240172 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define fi first
#define se second
#define sz(s) (int)s.size()
#define bit(i, j) ((j >> i) & 1)
#define all(v) v.begin(), v.end()
#define taskname "file"

typedef long long ll;

const int N = 1e7, M = 1e5;
int m, q, p[N + 5], dp[N + 5], u[N + 5];
bool cnt[N + 5];

void sangnt(){
    vector <int> v;
    for (int i = 2; i <= N; ++i){
        if (!u[i]){
            u[i] = i;
            v.push_back(i);
        }
        for (int j : v){
            if (i * j > N) break;
            u[i * j] = j;
            if (u[i * j] == u[i]) break;
        }
    }
}

void solve(){
    sangnt();
    cin >> m >> q;
    for (int i = 1; i <= m; ++i){
        cin >> p[i];
        cnt[p[i]] = true;
    }
    dp[0] = 0;
    deque <int> dq;
    dq.push_back(0);
    int pos = 1;
    while (pos <= N){
        int mx = -1;
        while (sz(dq)){
            int x = dq.back();
            dq.pop_back();
            if (!x){
                for (int i = 1; i <= m; ++i) mx = max(mx, p[i] - 1);
            }
            else{
                int d = x;
                while (d > 1){
                    int uoc = u[d];
                    if (!cnt[uoc]) break;
                    mx = max(mx, x + uoc - 1);
                    d /= uoc;
                }
            }
        }
        if (pos > mx) break;
        if (mx > N) mx = N;
        for (int i = pos; i <= mx; ++i){
            dq.push_back(i);
            dp[i] = dp[pos - 1] + 1;
        }
        pos = mx + 1;
    }
    while (q--){
        int n;
        cin >> n;
        if (!n) cout << 0 << "\n";
        else if (dp[n]) cout << dp[n] << "\n";
        else cout << "oo\n";
    }
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    // freopen(taskname".inp", "r", stdin);
    // freopen(taskname".out", "w", stdout);
    int tt = 1;
    // cin >> tt;
    while (tt--) solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...