Submission #1247786

#TimeUsernameProblemLanguageResultExecution timeMemory
1247786piedavBrunhilda’s Birthday (BOI13_brunhilda)C++20
25.24 / 100
518 ms311384 KiB
#include <iostream>
#include <vector>
#include <set>
using namespace std;

#define int long long

int32_t main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int m, q;
    cin >> m >> q;
    vector<int> p (m);
    //quickly check if the product > 10^7
    int product = 1;
    for(int i = 0; i < m; ++i) {
        cin >> p[i];
        if(product <= 10000000) product *= p[i];
    }
    int maxn = min(product, 10000000LL);
    vector<bool> mults (maxn+1, 0);
    vector<int> largestPrime (maxn+1, 1);
    for(int i = 0; i < m; ++i) {
        for(int j = p[i]; j <= maxn; j += p[i]) {
            mults[j] = 1;
            largestPrime[j] = p[i];
        }
    }
    vector<int> multiples;
    for(int i = 0; i <= maxn; ++i) {
        if(mults[i]) multiples.push_back(i);
    }
    vector<int> best (maxn+1, 1e9);
    for(int i = 0; i < m; ++i) {
        best[best.size()-1] = min(best[best.size()-1], (long long)((best.size()-1)/p[i]*p[i]));
    }
    for(int i = best.size()-2; i >= 0; --i) {
        best[i] = min(best[i+1], (i+1)-largestPrime[i+1]);
    }
    vector<int> ans (maxn+1, 1e9); //max distance
    for(int i = 0; i < p[m-1]; ++i) {
        ans[i] = 1;
    }
    for(int i = p[m-1]; i < maxn+1; ++i) {
        ans[i] = ans[best[i]] + 1;
    }
    int n;
    for(int i = 0; i < q; ++i) {
        cin >> n;
        if(n >= product) {
            cout << "oo\n";
            continue;
        }
        cout << ans[n] << endl;
        
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...