import std.stdio, std.string, std.conv; import std.range, std.algorithm, std.array, std.typecons, std.container; import std.math, std.numeric, core.bitop; enum inf = 10L^^17 + 10; void main() { long d; scan(d); long getLength(long x) { if (x == 0) { return 0; } int dig = digit(x); long res; foreach (i ; 1 .. dig) { res += 1L * i * 9 * 10L^^(i - 1); } res += 1L * dig * (x - 10L^^(dig - 1) + 1); return res; } long ok = 0, ng = inf; while (abs(ok - ng) > 1) { long mid = (ok + ng) / 2; if (getLength(mid) < d) { ok = mid; } else { ng = mid; } } debug { writeln(ok); writeln(getLength(ok)); } long r = d - getLength(ok); long next = ok + 1; writeln(next.to!string[r.to!int - 1]); } int digit(long x) { return x > 0 ? digit(x / 10) + 1 : 0; } void scan(T...)(ref T args) { import std.stdio : readln; import std.algorithm : splitter; import std.conv : to; import std.range.primitives; auto line = readln().splitter(); foreach (ref arg; args) { arg = line.front.to!(typeof(arg)); line.popFront(); } assert(line.empty); } void fillAll(R, T)(ref R arr, T value) { static if (is(typeof(arr[] = value))) { arr[] = value; } else { foreach (ref e; arr) { fillAll(e, value); } } }