Digit Queuries
skohan / June 2021
Problem link: https://cses.fi/problemset/task/2431/
explaination
The brute force algorithm is not effiecient cause the value of k can go upto 10^18.
We need algorithm of almost O(logN). Instead of looping through every number,
we can skip the numbers which might not have the index. For example, for index 13
we don’t need to check for numbers from 1 to 9, hence we skip them.
For current number of digits, which is 1 initially, we calculate how much indexes
will it cover. So, for numbers from 1 to 9, they will cover indexes till 9.
We find the number of minimum digits required in number to reach up to index k.
Then we find the exact number which will include the kth index. And finally we
find the index from that number.
#!/usr/bin/env python3
import math
mod = int(1e9+7)
def the_number(k, digits):
frm = pow(10, digits-1)
to = pow(10, digits) - 1
s = (to - frm + 1)*digits
if k > s:
return the_number(k-s, digits+1)
req = frm + k//digits
off = k%digits
if off == 0:
return (req-1)%10
st = str(req)
req = st[off-1]
return int(req)
def solve():
q = int(input())
for _ in range(q):
k = int(input())
print(the_number(k,1))
t = 1
# t = int(input())
for _ in range(t):
# print(f"Case #{_+1}: ", end="")
solve()