二分,模拟。
#include <iostream>
#include <cstdio>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <map>
#include <algorithm>
#include <cmath>
#include <stdlib.h>
#include <stdio.h>
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define uint unsigned int
#define l(x) x<<1
#define r(x) x<<1|1
#define ms(a,b) memset(a,b,sizeof(a))
using namespace std;
unsigned int d1[31269],d2[31269];
int t, n,res;
int main(){
d1[1] = 1;
d2[1] = 1;
for (int i = 2; i < 31269; i++) {
d1[i] = d1[i - 1] + (int)log10((double)i) + 1;
d2[i] = d2[i - 1] + d1[i];
}
cin >> t;
while (t--) {
cin >> n;
int i = upper_bound(d2, d2 + 31269, n) - d2;
if (n == d2[i - 1])
i--;
int pos = n - d2[i-1];
int len = 0;
for (i = 1; len < pos; i++)
len += (int)log10((double)i) + 1;
cout << ((i - 1) / (int)pow((double)10, len - pos) % 10) << endl;
}
return 0;
}