这个题目我在很久以前做过,不过是很蠢的方法,结果还是用了16ms,现在几乎是暴力都能0ms AC,一年的时间过得好快,两年的时间也好快。。。。我的方法应该很好理解,首先是要一路减下去,先确定这个数是在 多大 的范围内,然后再确定。我先自己确定了一下2147483647个数 大约在1-150000范围内。所以是10^6,t=10;故最多是 10^7。这样做不会爆。
代码:
#include<iostream>
using namespace std;
int num[10]={0,9,99,999,9999,99999,999999,9999999};
void Solve(int i,int n)
{
if( n%i==0)
printf("%d\n",(n/i+num[i-1])%10);
else{
for(int j=1;j<=6;j++){
if( n%i==j){
printf( "%d\n",(n/i+1+num[i-1])%(num[i-j+1]+1)/(num[i-j]+1) );
break;
}
}
}
}
int main()
{
int n,t;
scanf("%d",&t);
int cnt=0,i,x;
while( t--){
scanf("%d",&n);
cnt=0;
for( i=1; n>0;i++){
if( i<10){
cnt+=1;
n-=cnt;
}
else if( i<100){
cnt+=2;
n-=cnt;
}
else if( i<1000){
cnt+=3;
n-=cnt;
}
else if( i<10000){
cnt+=4;
n-=cnt;
}
else if( i<100000){
cnt+=5;
n-=cnt;
}
else{
cnt+=6;
n-=cnt;
}
} //确定这个数是几;
n+=cnt;
for( i=1; i<=6;i++){ //进一步缩小到是几位的
x=i*(num[i]-num[i-1]);
if( n>x)
n-=x;
else
break;
}
Solve(i,n);
}
return 0;
}