| Task: | Kyselyt |
| Sender: | eliaskosunen |
| Submission time: | 2017-10-06 21:03:48 +0300 |
| Language: | C++ |
| Status: | READY |
| Result: | 0 |
| group | verdict | score |
|---|---|---|
| #1 | WRONG ANSWER | 0 |
| #2 | WRONG ANSWER | 0 |
| #3 | TIME LIMIT EXCEEDED | 0 |
| test | verdict | time | group | |
|---|---|---|---|---|
| #1 | WRONG ANSWER | 0.05 s | 1 | details |
| #2 | WRONG ANSWER | 0.06 s | 2 | details |
| #3 | TIME LIMIT EXCEEDED | -- | 3 | details |
Code
#include <algorithm>
#include <cassert>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
template <typename T>
int count_digits(T number)
{
int digits = 0;
while (number) {
number /= 10;
digits++;
}
return digits;
}
template <typename T>
T pow10(T pow)
{
T n = 1;
for (T i = 1; i < pow; ++i) {
n *= 10;
}
return n;
}
template <typename T>
char get_digit(T number, std::size_t digit)
{
return (number / pow10(digit)) % 10 + '0';
}
template <typename T>
std::size_t get_next_pow10(T number)
{
std::size_t i = 1;
while ((i * 10) < number) {
i *= 10;
}
return i;
}
struct series_point {
std::size_t member{1};
std::size_t number{1};
constexpr series_point() = default;
series_point& get_point(std::size_t m)
{
while (true) {
if (member >= m) {
return *this;
}
if (member - m >= 25) {
const auto digits = count_digits(number);
const auto next_pow10 = get_next_pow10(number);
const auto dist_till_pow10 = [&]() -> std::size_t {
if (next_pow10 <= number)
return 0;
return next_pow10 - number;
}();
if (dist_till_pow10 > 1 &&
dist_till_pow10 <
std::numeric_limits<std::size_t>::min() - 1000) {
member += dist_till_pow10 * digits;
number += dist_till_pow10;
continue;
}
}
member += count_digits(number++);
}
}
series_point& get_prev()
{
member -= count_digits(--number);
return *this;
}
char get_char(std::size_t m)
{
get_point(m);
if (member > m) {
get_prev();
}
return get_digit(number, m - member);
}
series_point copy() const
{
return *this;
}
friend std::ostream& operator<<(std::ostream& os, const series_point& p)
{
os << "member: " << p.member << ", number: " << p.number;
return os;
}
};
struct input {
std::size_t i{0};
std::size_t k{0};
char result{0};
friend std::ostream& operator<<(std::ostream& os, const input& i)
{
os << "i: " << i.i << ", k: " << i.k << ", result: " << i.result;
return os;
}
};
int main()
{
/* series_point s; */
/* assert(series_point{}.get_char(1) == '1'); */
/* assert(series_point{}.get_char(10) == '1'); */
/* assert(series_point{}.get_char(11) == '0'); */
/* for (std::size_t i = 1; i <= 1010; ++i) { */
/* auto a = s.get_char(i); */
/* auto c = series_point{}.get_char(i); */
/* if (i % 29 == 0) { */
/* auto tmp = series_point{}; */
/* auto b = tmp.get_char(i); */
/* if (a != b) { */
/* std::cout << " * At i = " << i << ", a != b:\n" */
/* << " a = " << a << ", b = " << b << '\n' */
/* << " State of s (a): " << s << '\n' */
/* << " State of tmp (b): " << tmp << '\n'; */
/* } */
/* if(b != c) { */
/* std::cout << " * At i = " << i << ", b != c:\n" */
/* << " b = " << b << ", c = " << c << '\n' */
/* << " State of tmp (b): " << tmp << '\n'; */
/* } */
/* } */
/* } */
series_point s;
int q;
std::cin >> q;
std::vector<input> inputs(q);
{
std::size_t ix = 0;
for (auto& i : inputs) {
i.i = ix;
std::cin >> i.k;
++ix;
}
std::sort(inputs.begin(), inputs.end(),
[](input a, input b) { return a.k < b.k; });
}
for (auto& i : inputs) {
i.result = s.get_char(i.k);
}
std::sort(inputs.begin(), inputs.end(),
[](input a, input b) { return a.i < b.i; });
for (auto& i : inputs) {
std::cout << i.result << '\n';
}
}
Test details
Test 1
Group: 1
Verdict: WRONG ANSWER
| input |
|---|
| 1000 582 214 723 273 ... |
| correct output |
|---|
| 0 1 7 7 6 ... |
| user output |
|---|
| 3 8 7 2 9 ... Truncated |
Test 2
Group: 2
Verdict: WRONG ANSWER
| input |
|---|
| 1000 615664 916441 627600 279508 ... |
| correct output |
|---|
| 1 2 3 2 2 ... |
| user output |
|---|
| 9 2 1 1 3 ... Truncated |
Test 3
Group: 3
Verdict: TIME LIMIT EXCEEDED
| input |
|---|
| 1000 672274832941907421 260504693279721732 646999966092970935 100853063389774434 ... |
| correct output |
|---|
| 7 2 2 0 9 ... |
| user output |
|---|
| (empty) |
