Task: | Kyselyt |
Sender: | eliaskosunen |
Submission time: | 2017-10-07 13:41:53 +0300 |
Language: | C++ |
Status: | READY |
Result: | 0 |
group | verdict | score |
---|---|---|
#1 | WRONG ANSWER | 0 |
#2 | WRONG ANSWER | 0 |
#3 | WRONG ANSWER | 0 |
test | verdict | time | group | |
---|---|---|---|---|
#1 | WRONG ANSWER | 0.06 s | 1 | details |
#2 | WRONG ANSWER | 0.05 s | 2 | details |
#3 | WRONG ANSWER | 0.06 s | 3 | details |
Compiler report
input/code.cpp: In function 'int main()': input/code.cpp:194:25: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result] std::scanf("%d", &q); ^ input/code.cpp:199:30: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result] std::scanf("%zd", &i); ^
Code
#include <algorithm> #include <array> #include <cassert> #include <cstdio> #include <map> #include <set> #include <string> #include <unordered_map> #include <vector> std::size_t count_digits(std::size_t x) { // clang-format off return (x < 10u ? 1 : (x < 100u ? 2 : (x < 1000u ? 3 : (x < 10000u ? 4 : (x < 100000u ? 5 : (x < 1000000u ? 6 : (x < 10000000u ? 7 : (x < 100000000u ? 8 : (x < 1000000000u ? 9 : (x < 10000000000u ? 10 : (x < 100000000000u ? 11 : (x < 1000000000000u ? 12 : (x < 10000000000000u ? 13 : (x < 100000000000000u ? 14 : (x < 1000000000000000u ? 15 : (x < 10000000000000000u ? 16 : (x < 100000000000000000u ? 17 : (x < 1000000000000000000u ? 18 : (x < 10000000000000000000u ? 19 : 20))))))))))))))))))); // clang-format on } std::size_t pow10(std::size_t pow) { static std::array<std::size_t, 20> p = {{1u, 10u, 100u, 1000u, 10000u, 100000u, 1000000u, 10000000u, 100000000u, 1000000000u, 10000000000u, 100000000000u, 1000000000000u, 10000000000000u, 100000000000000u, 1000000000000000u, 10000000000000000u, 100000000000000000u, 1000000000000000000u, 10000000000000000000u}}; return p[pow]; } char get_digit(std::size_t number, std::size_t digit) { digit = count_digits(number) - digit - 1; return (number / pow10(digit)) % 10 + '0'; } std::size_t get_matching_pow10(std::size_t number) { return count_digits(number); } std::size_t get_next_pow10(std::size_t number) { return get_matching_pow10(number) + 1; } std::size_t numbers_with_length(std::size_t len) { return 9 * pow10(len - 1); } std::size_t digits_with_length(std::size_t len) { return numbers_with_length(len) * len; } std::size_t numbers_with_length_upto(std::size_t len) { static std::array<std::size_t, 20> store{ {9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; if (store[len - 1] == 0) { store[len - 1] = numbers_with_length_upto(len - 1) * 10 + 9; } return store[len - 1]; } std::size_t digits_with_length_upto(std::size_t len) { static std::array<std::size_t, 20> store{ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; if (store[len - 1] == 0) { store[len - 1] = ((9 * (pow10(len) * (len + 1))) - pow10(len + 1) + 1) / 9; } return store[len - 1]; } /* std::size_t g(std::size_t n) { */ /* return (9 * (pow10(n) * (n + 1)) - pow10(n + 1) + 1) / 9; */ /* } */ std::size_t digits_in_member(std::size_t n) { for (auto i = 0; i < 20; ++i) { if (digits_with_length_upto(i) >= n) { return i; } } return 20; } char digit(std::size_t n) { if(n < 10) { return n + '0'; } auto d = digits_in_member(n); /* auto digit_n = digits_with_length_upto(d) - digits_with_length_upto(d - * 1); */ auto digit_n = n - digits_with_length_upto(d - 1); auto ord = digit_n / d; if (digit_n % d != 0) { ++ord; } auto num = ord + numbers_with_length_upto(d - 1); /* auto index = d - ord % d - 1; */ return get_digit(num, ord % d); } /* char digit(std::size_t n) */ /* { */ /* auto d = decade(n); */ /* auto digit_of_decade = get_amount_of_members_with_length(d); */ /* for (auto i = d; i > 0; --i) { */ /* digit_of_decade -= get_amount_of_members_with_length(i); */ /* } */ /* auto ord = digit_of_decade / d; */ /* if (digit_of_decade % d != 0) { */ /* ++ord; */ /* } */ /* auto num = [=]() { */ /* std::size_t ret = 0; */ /* for (auto i = 1; i < n; ++i) { */ /* ret += get_amount_of_members_with_length(i); */ /* } */ /* return ret; */ /* }(); */ /* auto index = d - ord % d; */ /* return get_digit(num, index); */ /* } */ int main() { /* series_point s; */ /* assert(pow10(1) == 10); */ /* assert(pow10(2) == 100); */ /* std::cout << get_digit(13, 0) << ' ' << get_digit(13, 1) << '\n'; */ /* assert(get_digit(1, 0) == '1'); */ /* assert(get_digit(13, 1) == '3'); */ /* 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::scanf("%d", &q); #if 1 std::vector<std::size_t> inputs(q); for (auto& i : inputs) { std::scanf("%zd", &i); } std::vector<char> outputs(q); for (auto i = 0; i < q; ++i) { outputs[i] = digit(inputs[i]); } for (auto& o : outputs) { std::putchar(o); std::putchar('\n'); } #elif 0 std::vector<input> inputs(q); { auto i = 0; for (auto& input : inputs) { input.i = i; std::scanf("%zd", &input.k); ++i; } } std::vector<std::size_t> outputs(q); { std::size_t prev = 0; for (auto& input : inputs) { if (input.k < prev && prev - input.k > 10000 && input.k < pow10(9)) { s = series_point{}; } outputs[input.i] = s.get_char(input.k); prev = input.k; } } for (auto& o : outputs) { std::putchar(o); std::putchar('\n'); } #elif 0 /* std::vector<input> inputs(q); */ /* std::multiset<input> inputs{}; */ std::vector<input> inputs(q); std::vector<std::size_t> input_keys(q); /* std::unordered_map<std::size_t, input> inputs{}; */ /* std::vector<std::size_t> input_keys(q); */ { /* std::size_t ix = 0; */ /* for (auto& i : inputs) { */ /* for (auto ix = 0; ix < q; ++ix) { */ /* input tmp{}; */ /* std::scanf("%zd", &tmp.k); */ /* tmp.i = ix; */ /* inputs.insert(std::move(tmp)); */ /* inputs.insert(std::make_pair(tmp.k, tmp)); */ /* input_keys[ix] = tmp.k; */ /* } */ std::size_t prev = 0; for (auto i = 0; i < q; ++i) { input tmp{}; std::scanf("%zd", &tmp.k); tmp.i = i; tmp.prev = prev; prev = tmp.k; inputs[i] = std::move(tmp); } std::sort(inputs.begin(), inputs.end()); for (auto i = 0; i < q; ++i) { input_keys[i] = inputs[i].i; } } /* std::vector<input> inputs(q); */ /* { */ /* std::size_t i = 0; */ /* for (auto& input : inputs) { */ /* std::scanf("%zd", &input.k); */ /* input.i = i; */ /* ++i; */ /* } */ /* } */ /* std::vector<std::size_t> outputs(q); */ /* for(auto i = 0; i < q; ++i) { */ /* outputs[i] = */ /* } */ std::vector<std::size_t> outputs(q); for (auto i = 0; i < q; ++i) { /* outputs[input_keys[i]] = s.get_char(inputs[i].k); */ outputs[input_keys[i]] = digit(inputs[i].k); } for (auto& o : outputs) { std::putchar(o); std::putchar('\n'); } /* for (auto& i : outputs) { */ /* std::putchar(i); */ /* std::putchar('\n'); */ /* } */ #endif }
Test details
Test 1
Group: 1
Verdict: WRONG ANSWER
input |
---|
1000 582 214 723 273 ... |
correct output |
---|
0 1 7 7 6 ... |
user output |
---|
0 1 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 |
---|
2 2 2 3 3 ... Truncated |
Test 3
Group: 3
Verdict: WRONG ANSWER
input |
---|
1000 672274832941907421 260504693279721732 646999966092970935 100853063389774434 ... |
correct output |
---|
7 2 2 0 9 ... |
user output |
---|
9 8 7 2 8 ... Truncated |