Submission #868587

#TimeUsernameProblemLanguageResultExecution timeMemory
868587KarootBrunhilda’s Birthday (BOI13_brunhilda)C++17
100 / 100
429 ms120492 KiB
#include <iostream>
#include <cmath>
#include <unordered_map>
#include <map>
#include <set>
#include <queue>
#include <vector>
#include <string>
#include <iomanip>
#include <algorithm>
 
#define all(x)  (x).begin(), (x).end()
#define rall(x)  (x).rbegin(), (x).rend()
 
using namespace std;
 
typedef long long ll;
 
ll linf = 1e15+1;
 
inline void scoobydoobydoo(){
    ios::sync_with_stdio(false);
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
}
 
const int MAXN = 1e7+1;
 
pair<int, int> dp[MAXN];
int distFrom[MAXN];
int biggestPrime;
 
 
void initDistFrom(int latestW){
    for (int i = 1; i < biggestPrime; i++){
        distFrom[i] = 1;
    }
 
    for (int i = biggestPrime; i <= MAXN; i++){
        if (dp[i].second == 0){
            distFrom[i] = 0;
            continue;
        }
        distFrom[i] = (distFrom[i-i%dp[i].second] == 0 ? 0 : distFrom[i-i%dp[i].second]+1);
    }
}
 
 
int main(){
    scoobydoobydoo();
    int n, q; cin >> n >> q;
    vector<int> primez(n);
    for (int i = 0; i < n; i++){
        cin >> primez[i];
    }
 
    biggestPrime = primez[n-1];
 
    int latest = -1;
    int latestW = -1;
 
    for (int e : primez){
        int worth = ((int)1e7)%e;
        if (worth >= latestW){
            latestW = worth;
            latest = e;
        }
    }
 
 
    vector<int> ans;
 
    for (int i = n-1; i >= 0; i--){
        for (int e = primez[i]-1; e <= MAXN; e += primez[i]){
            if (!dp[e].first){
                dp[e] = {primez[i]-1, primez[i]};
            }
        }
    }
 
    
    for (int i = MAXN; i >= 0; i--){
        if (dp[i].first){
            if (i%latest > dp[i].first){
                dp[i].first = i%latest;
                dp[i].second = latest;
            } else {
                latest = dp[i].second;
            }
        } else {
            dp[i] = {i%latest, latest};
        }
    }
 
    initDistFrom(latestW);
 
    while (q--){
        int x; cin >> x;
        if (distFrom[x] == 0)ans.push_back(-1);
        else ans.push_back(distFrom[x]);
    }
 
    for (auto& e : ans){
        if (e == -1)cout << "oo" << endl;
        else cout << e << endl;
    }
 
 
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...