在玩oeis的时候,我发现了一个很有意思的东西
机翻(
什么意思呢?就是可以在接近(O(1))的时间内得到一个回文数字在回文序列中的位置(就是它是第几个回文数字)
具体来说:
对于长度为偶数的:取前半部分,在最前面添上1。例如 98766789, 取 9876 添上 1, 所以它是第 19876个回文数。
对于长度为奇数的:取前半部分和之间的数, 最高位加一,例如 515 取 51, 5加一, 所以它是第61个回文数。
(事实上稍加证明就可以得到这个结论, 具体思路就是找小于N的回文数有多少个,然后发现可以把一个回文数拆成两部分, 枚举前一半就可以得到新的回文数。)
tql!这样我们可以快速判断一个回文数的位置, 从而进行二分等操作, 找到符合要求的回文数。
当然, 我们可以将上面的算法反过来(即求第x个回文数是什么),这样会更方便
(考场代码就不放了吧)
(具体就是判断x第一位是不是1, 如果不是说明长度是奇数, 是的话如果第二位是零的话长度还是奇数, 否则长度是偶数, 接下来分开模拟即可)
(不懂仔细思考即可)
这就是nowcoder NIT的数的解法, 写出上面的东西,然后二分即可。
具体的说, 二分找到大于n的第一个回文数, 假设它是第x个, 那么答案就是(x+k-1)个回文数。