#include <stdio.h>
long long int Lv[] = { 0,1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 0 };
long long int Fix[] = { 0, 9, 189, 2889, 38889, 488889, 5888889, 68888889, 788888889 };
long long int LvFix[] = { 0, 45, 9045, 1395495, 189414495, 23939649495 };
long long int fGetTotalN(long long int n, long long int m)
{
if (n == 0)
{
return 0;
}
//printf("%d ",n);
n = n - Lv[m] +1;
return n*Fix[m - 1] + n*((1+n)*m) / 2;
}
//11212312341234512345612345671234567812345678912345678910123456789101112345678910
long long int fGetMaxNumber(long long int index, long long int i_lv)
{
long long int lv = i_lv;
long long int i_number = 0;
while (Lv[i_lv ] != 0)
{
if (fGetTotalN(i_number + Lv[i_lv ], lv) < index)
{
i_number += Lv[i_lv];
}else
{
--i_lv;
}
}
return i_number;
}
long long int fGetNumberByNumber(long long int number,
long long int pos)
{
int c_n[20] = { 0 };
int i = 0;
while (number > 0)
{
c_n[i++] = number % 10;
number = number / 10;
}
return c_n[i-1-pos];
}
long long int fGetNumberByIndex(long long int index)
{
long long int i_lv = 0;
while (Fix[i_lv] < index)
{
i_lv += 1;
}
if (i_lv > 0)
{
i_lv -= 1;
}
long long int pos = index - Fix[i_lv];
long long int number = (pos-1) / (i_lv + 1) + Lv[i_lv + 1];
return fGetNumberByNumber(number, (pos-1)%(i_lv + 1));
}
int fGetIndex(long long int index)
{
for (int i = 0; i < 7; ++i)
{
if (LvFix[i] >= index)
{
return i;
}
}
}
void fShow(long long int number)
{
int lv = fGetIndex(number);
long long int index = number - LvFix[lv - 1];
// printf("%d %d ",lv,index);
long long int max_number = fGetMaxNumber(index, lv);
// printf("%d ",max_number+1);
printf("%d\n",fGetNumberByIndex(index - fGetTotalN(max_number,lv)));
}
int main()
{
int n;
long long int m;
scanf("%d", &n);
//fShow(n);
for (int i = 1; i <=n; ++i)
{
//printf("%d\n",fGetTotalN(i,2));
scanf("%lld", &m);
fShow(m);
}
}
转载请注明原文地址: https://ju.6miu.com/read-679604.html