题意:把数字1,12,123,1234,12345,,,,连起来,问第k个数字是多少,原以为最大的数会很大,看了discuss之后发现才30000多点,直接暴力到100000。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <string>
#define LL long long
#define DB double
#define SF scanf
#define PF printf
#define N 100009
#define bug cout<<"bug"<<endl;
using namespace std;
LL sum[N];
int re[N*5];
int tmp[N];
void init()
{
int cnt=0;
int c[10],k;
for(int i=1;i<N;i++)
{
int t = i;
k = 0;
while(t>0)
{
c[k++]=t%10;
t/=10;
}
sum[i] = sum[i-1]+tmp[i-1]+k;
tmp[i] = tmp[i-1]+k;
while(k)
{
re[cnt++] = c[--k];
}
}
}
int find(LL k)
{
int l = 0,r=N-1,ret,mid;
while(l<=r)
{
mid = (l+r)>>1;
if(sum[mid]>k)
{
r = mid-1;
}else
{
ret = mid;
l = mid+1;
}
}
return ret;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
init();
int n,a;
SF("%d",&n);
while(n--)
{
SF("%d",&a);
a--;
int t = find(a);
a-=sum[t];
PF("%d\n",re[a]);
}
return 0;
}