#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int K, Q, D, M, A[5050];
vector<int> G[1010101];
unordered_map<ll, int> Vst, Prv;
inline ll Mod(ll t){ return (t %= K) >= 0 ? t : t + K; }
void SmallBFS(){
queue<ll> Que; Que.push(0); Vst[0] = 1;
while(!Que.empty()){
ll v = Que.front(); Que.pop();
for(int i=1; i<=D; i++){
ll nxt = v * K + A[i];
if(abs(nxt) > M || Vst.find(nxt) != Vst.end()) continue;
Que.push(nxt); Vst[nxt] = 1; Prv[nxt] = A[i];
}
}
}
int Check(ll n){
if(auto it=Vst.find(n); it != Vst.end()) return it->second;
for(auto i : G[Mod(n)]) if(Check((n - A[i]) / K)) { Prv[n] = A[i]; return Vst[n] = 1; }
return Vst[n] = 0;
}
vector<int> Path(ll n){
vector<int> res;
if(n != 0){
if(!Check(n)) return {};
while(n != 0) res.push_back(Prv[n]), n = (n - Prv[n]) / K;
reverse(res.begin(), res.end());
return res;
}
else{
for(int i=1; i<=D; i++) if(A[i] == 0) return {A[i]};
for(auto i : G[0]){
if(!Check(-A[i] / K)) continue;
res = Path(-A[i] / K); res.push_back(A[i]);
return res;
}
return {};
}
}
int main(){
ios_base::sync_with_stdio(false); cin.tie(nullptr);
cin >> K >> Q >> D >> M;
for(int i=1; i<=D; i++) cin >> A[i], G[Mod(A[i])].push_back(i);
SmallBFS();
for(int q=1; q<=Q; q++){
ll n; cin >> n;
auto path = Path(n);
if(path.empty()) cout << "IMPOSSIBLE\n";
else for(int i=0; i<path.size(); i++) cout << path[i] << " \n"[i+1==path.size()];
}
}
Compilation message
Main.cpp: In function 'int Check(ll)':
Main.cpp:23:8: warning: init-statement in selection statements only available with '-std=c++17' or '-std=gnu++17'
23 | if(auto it=Vst.find(n); it != Vst.end()) return it->second;
| ^~~~
Main.cpp: In function 'int main()':
Main.cpp:56:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
56 | else for(int i=0; i<path.size(); i++) cout << path[i] << " \n"[i+1==path.size()];
| ~^~~~~~~~~~~~
Main.cpp:56:75: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
56 | else for(int i=0; i<path.size(); i++) cout << path[i] << " \n"[i+1==path.size()];
| ~~~^~~~~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
14 ms |
24020 KB |
OK |
2 |
Correct |
12 ms |
23940 KB |
OK |
3 |
Correct |
13 ms |
23960 KB |
OK |
4 |
Correct |
12 ms |
24036 KB |
OK |
5 |
Correct |
13 ms |
24032 KB |
OK |
6 |
Correct |
14 ms |
24036 KB |
OK |
7 |
Runtime error |
844 ms |
1048576 KB |
Execution killed with signal 9 |
8 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
14 ms |
24020 KB |
OK |
2 |
Correct |
12 ms |
23940 KB |
OK |
3 |
Correct |
13 ms |
23960 KB |
OK |
4 |
Correct |
12 ms |
24036 KB |
OK |
5 |
Correct |
13 ms |
24032 KB |
OK |
6 |
Correct |
14 ms |
24036 KB |
OK |
7 |
Runtime error |
844 ms |
1048576 KB |
Execution killed with signal 9 |
8 |
Halted |
0 ms |
0 KB |
- |