| Task: | Numerot |
| Sender: | Metabolix |
| Submission time: | 2020-10-17 22:06:16 +0300 |
| Language: | C++ (C++17) |
| Status: | READY |
| Result: | 25 |
| group | verdict | score |
|---|---|---|
| #1 | ACCEPTED | 12 |
| #2 | ACCEPTED | 13 |
| #3 | TIME LIMIT EXCEEDED | 0 |
| test | verdict | time | group | |
|---|---|---|---|---|
| #1 | ACCEPTED | 0.09 s | 1, 2, 3 | details |
| #2 | ACCEPTED | 0.41 s | 2, 3 | details |
| #3 | TIME LIMIT EXCEEDED | -- | 3 | details |
Code
#include <bits/stdc++.h>
std::unordered_map<long, std::pair<long, long>> cache[10];
long pows[] = {
1l,
10l,
100l,
1000l,
10000l,
100000l,
1000000l,
10000000l,
100000000l,
1000000000l,
10000000000l,
100000000000l,
1000000000000l,
10000000000000l,
100000000000000l,
1000000000000000l,
10000000000000000l,
100000000000000000l,
1000000000000000000l
};
std::pair<long, long> f(long luku, const long maxnum = 0) {
long key = luku;
if (cache[maxnum].find(key) != cache[maxnum].end()) {
return cache[maxnum].find(key)->second;
}
if (luku < maxnum) {
return {1, -maxnum};
}
if (luku <= 9) {
if (maxnum == 0) {
return {1, -luku};
}
return {2, -(luku + maxnum)};
}
long askelia = 0;
long muutos = 0;
while (luku > 9) {
auto s = std::to_string(luku);
bool muutettu = false;
for (unsigned i = 1; i < s.length() - 1; ++i) {
if (s[s.length() - 1 - i] != '0') {
auto newmaxnum = maxnum;
for (unsigned j = i + 1; j < s.length(); ++j) {
int c = s[s.length() - 1 - j] - '0';
if (c > newmaxnum) {
newmaxnum = c;
}
}
auto am = f(luku % pows[i+1], newmaxnum);
askelia += am.first;
muutos += am.second;
luku += am.second;
muutettu = true;
break;
}
}
if (!muutettu) {
askelia += 1;
auto num = std::max<long>({maxnum, s[0] - '0', *s.rbegin() - '0'});
muutos -= num;
luku -= num;
}
}
cache[maxnum][key] = {askelia, muutos};
return cache[maxnum][key];
}
long g(long x) {
return f(x).first + 1;
}
int main() {
int t;
std::cin >> t;
for (int i = 0; i < t; ++i) {
long x;
std::cin >> x;
if (x == 1) {
std::cout << "1\n";
continue;
}
long k0 = 9, k1 = 9000000000000000001l;
while (k1 - k0 > 1) {
long k = ((unsigned long)k1 + (unsigned long)k0) / 2;
if (g(k) < x) {
k0 = k;
} else {
k1 = k;
}
}
std::cout << k1 << "\n";
}
}
Test details
Test 1
Group: 1, 2, 3
Verdict: ACCEPTED
| input |
|---|
| 1000 1 2 3 4 ... |
| correct output |
|---|
| 1 10 11 20 22 ... |
| user output |
|---|
| 1 10 11 20 22 ... Truncated |
Test 2
Group: 2, 3
Verdict: ACCEPTED
| input |
|---|
| 1000 224995 413660 249827 2125 ... |
| correct output |
|---|
| 1731724 3216040 1940719 14585 532612 ... |
| user output |
|---|
| 1731724 3216040 1940719 14585 532612 ... Truncated |
Test 3
Group: 3
Verdict: TIME LIMIT EXCEEDED
| input |
|---|
| 1000 627887018110416188 785474884983906653 653772166720939773 784335285960673683 ... |
| correct output |
|---|
| 5530371754830260284 6918696171534226533 5757755627065159149 6908439780325129803 3223801064342340738 ... |
| user output |
|---|
| (empty) |
