【二分】CF Round #587 (Div. 3)E2 Numerical Sequence (hard version)

题目大意

有一个无限长的数字序列,其组成为1 1 2 1 2 3 1.......1 2 ... n...,即重复的1~1,1~2....1~n,给你一个\(k\),求第\(k(k<=10^{18})\)个数字是什么。

思路

\(a[i]\)为该数到达\(i\)的长度,\(b[i]\)为第\(i\)个数那一块的长度,\(\sum b[i]=a[i]\),发现\([10^i,10^{i+1})\)的数长度均为\(i+1\),那么在这一段中\(b[i]\)都是一个等差数列,而计算\(a[i]\)就可以分为两块计算,在\(10^i\)之前前面应该就可以处理出来,考虑\(10^i\)之后的情况,设\(l=b[10^{i−1}],cnt=x−10i+1\),所以\(b[x]=b[10^{i−1}]+l×cnt+cnt×(cnt+1)/2×(i+1)\)
然后就好做了,两次二分就好了,第一次二分找到最大的i使\(b[i]<k\),那么解就在第\(i+1\)块中,\(k−=ssum[i]\);第二次二分找到最大的\(i\)使\(sum[i]<k\),那么解就在数\(i+1\)中,\(k−=sum[i]\)。最后数\(i+1\)的第\(k\)位就是答案。

代码

等会放 我好难
posted @ 2020-04-28 17:55  Midoria7  阅读(83)  评论(0编辑  收藏  举报