CSES - Datatähti 2018 alku - Results
Submission details
Task:Kyselyt
Sender:eliaskosunen
Submission time:2017-10-07 13:41:53 +0300
Language:C++
Status:READY
Result:0
Feedback
groupverdictscore
#10
#20
#30
Test results
testverdicttimegroup
#10.06 s1details
#20.05 s2details
#30.06 s3details

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:

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:

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:

input
1000
672274832941907421
260504693279721732
646999966092970935
100853063389774434
...

correct output
7
2
2
0
9
...

user output
9
8
7
2
8
...
Truncated