由于 n 的范围非常大(最高到 1018),我们不可能从 1 遍历到 n 来逐个检查每个数是否为一致数或递进数,这样做会超时。
注意到一致数和递进数的结构非常特殊,它们的数量相对稀少。这启发我们直接生成所有可能的一致数和递进数,然后统计其中有多少个小于或等于 n。
我们可以按照数字的构成方式来生成它们:
我们称一个十进制正整数为\emph{一致数},如果它的所有数位上的数字都相同。 我们称一个十进制正整数为\emph{递进数},如果它的位数至少为 2,且除最后一位外所有数位上的数字都相同,而最后一位数字恰好比前面的数字大 1。例如,12、23、2223 都是递进数,而 10、89、111 不是。注意,递进数的前置数字不能是 9,否则最后一位将变为 10,不合法,因此前置数字只可能取 1 到 8。
现在给定一个正整数 n,请你统计区间 [1,n] 中一致数与递进数的总数。
本题中,测试数据组数 t 不超过 104,每个 n 不超过 1018。
© CodeFun2000 · 使用条款
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册