假设:
S1 = 1
S2 = 12
S3 = 123
S4 = 1234
………
S9 = 123456789
S10 = 1234567891
S11 = 12345678912
…………
S18 = 123456789123456789
………………
现在我们把所有的串连接起来
S=1121231234…….1234567891234567891123456789123456789123………
求在S串中的第N个数字是多少?
分析:通过观察发现,如果把S串,拆分,不就是个数一次递增的子串集合嘛。因此我们通过求出N前面的所有子串的元素个数之和,用N减之,再模9;
另 n*(n+1)/2=N ;得出n=(sqrt (1+8*N )-1)/2
s=n*( n+1)/2 ;
注意:因为处理过程中有乘法的运算考虑用__int64;
#include<cstdio>
#include<cmath>
int main()
{
__int64 n;
int k;
scanf("%d",&k);
while(k--){
scanf("%I64d",&n);
__int64 t=(sqrt(8*(n))-1)/2;
__int64 s=(t*(t+1))/2;
if((n-s)%9==0) printf("9\n");
else
printf("%I64d\n",(n-s)%9);
}
return 0;
}