| 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 |
