hdu 1957 find the nth digit
阿新 • • 發佈:2018-11-11
假設:
S1 = 1
S2 = 12
S3 = 123
S4 = 1234
.........
S9 = 123456789
S10 = 1234567891
S11 = 12345678912
............
S18 = 123456789123456789
..................
現在我們把所有的串連線起來
S = 1121231234.......123456789123456789112345678912.........
那麼你能告訴我在S串中的第N個數字是多少嗎?
Input
輸入首先是一個數字K,代表有K次詢問。
接下來的K行每行有一個整數N(1 <= N < 2^31)。
Output
對於每個N,輸出S中第N個對應的數字.
Sample Input
6 1 2 3 4 5 10
Sample Output
1 1 2 1 2 4
分析:此題第一眼看上去常規方法暴力之類的是肯定不行的;
現在我們統計前n個數的個數,即a[1]=1,a[2]=3,a[3]=6,a[4]=10,a[5]=15......
我們二分查詢到n所在的子串位子;然後用n減去n所在串前邊所有串的長度和,然後對9求餘即可;
#include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> using namespace std; long long a[66000]; int main() { int i; memset(a,0,sizeof(a)); for(i=1;i<=66000;i++) a[i]=a[i-1]+i;//打表 //printf("%d %d",a[0],a[1]); int n; scanf("%d",&n); while(n--) { int m; scanf("%d",&m); int l=1,r=66000,pos=-1; while(1) { int mid=(l+r)/2; if(a[mid]<m&&a[mid+1]>=m) { pos=mid; break; } if(a[mid]>=m) r=mid-1; if(a[mid+1]<m) l=mid+1; } int ans=m-a[pos];//減去m所在串前邊所有串的長度和 ans=ans%9; if(ans==0) ans=9; printf("%d\n",ans); } }