#include<iostream>
#include<vector>
#include<cstdlib>
#include<string>
#include<algorithm>
#include<set>
#include<math.h>
#include<map>
#include<deque>
#include<unordered_map>
#include<iomanip>
#include<queue>
#include<array>
#include<climits>
#include<cstring>
#include<unordered_set>
#include<cstdint>
#include<typeinfo>
#include <random>
using namespace std;
#define int long long
const int MAX = 1e7+1;
int32_t main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n,m;
cin>>n>>m;
vector<int> v(MAX,1);
vector<int> vec(MAX,0);
vector<int> go(MAX,1);
int biggest = 0;
int mul = 1;
bool work = true;
int small = INT_MAX;
int idk = INT_MAX;
for(int i = 0; i<n; i++){
int x;
cin>>x;
small = min(small,x);
mul *= x;
if(mul > MAX){
work = false;
}
biggest = max(biggest,x);
int temp = x;
while(temp < MAX){
if(vec[temp] < x && temp + x >= MAX){
idk = min(idk,temp);
}
if(vec[temp] < x){
vec[temp] = x;
}
temp += x;
}
}
for(int i = MAX-1; i>=0; i--){
go[i] = idk;
idk = min(idk,i-vec[i]);
}
for(int i = biggest; i<MAX; i++){
v[i] = v[go[i]]+1;
}
// vector<int> amt(MAX,0);
// int ind = 1;
// for(int i = small; i<MAX; i++){
// if(vec[i] != 0){
// if(i >= biggest){
// amt[v[i-vec[i]]+1] ++;
// }else{
// amt[v[i-vec[i]]] ++;
// }
// }
// while(i >= biggest && amt[ind] == 0){
// ind++;
// }
// if(i >= mul && work){
// break;
// }
// if(i < biggest){
// v[i] = 1;
// }else{
// v[i] = ind+1;
// }
// }
v[0] = 0;
for(int i = 0; i<m; i++){
int x;
cin>>x;
if(x >= mul && work){
cout<<"oo"<<"\n";
continue;
}
cout<<v[x]<<"\n";
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |