思路解析
1. 理解“特殊数”的定义
一个正整数如果能写成 n 的不同非负整数次幂之和,则称为特殊数。
换句话说,特殊数的 n 进制表示中,每一位只能是 0 或 1(不能有系数 ≥2,因为要求“不同次幂”,即每个幂次最多用一次)。
这其实就是 n 进制下的 0-1 形式,类似于二进制,但基数是 n。
2. 特殊数的序列规律
按升序排列所有特殊数,它们恰好对应着:
将 k 写成二进制(从低位到高位),然后以 n 为基数,把二进制位上的 1 替换成 n 的对应幂次,求和。
为什么?
所有特殊数的集合 = { sum_{i=0}^{∞} b_i * n^i | b_i ∈ {0,1},且只有有限个 b_i = 1 }
这正是 所有 有限位 n 进制 0-1 数。
按数值大小排序时,实际上就是把这些 0-1 串看作二进制数(只不过基数不是 2 而是 n,但 n>2 时大小关系与二进制相同吗?)
例:n=3,二进制 1 → 1,二进制 10 (2) → 3,二进制 11 (3) → 4,二进制 100 (4) → 9……
确实,升序排列时,恰好与自然数 k 的二进制表示一一对应,第 k 个特殊数 = 把 k 的二进制位当作 n 的幂次系数求和。
更严谨的论证:
考虑映射 f: 正整数(二进制) → 特殊数,f(b) = 将 b 的二进制位视为 n 进制 0-1 数。
由于 n ≥ 2,该映射严格单调递增(因为 n > 1,高位权重更大)。
因此,按数值从小到大排列的特殊数,恰好就是 f(1), f(2), f(3), …。
所以第 k 个特殊数 = f(k) = ∑ (k 的二进制第 i 位) * n^i。
3. 计算第 k 个特殊数
将 k 的二进制表示从低位向高位遍历(i=0,1,2,…)。
若第 i 位为 1,则累加 n^i。
最后输出累加和 mod (10^9+7)。
4. 举例验证
n=3, k=4(二进制 100):
i=0: 位0 → 0
i=1: 位1 → 0
i=2: 位2 → 1 → 加上 3^2 = 9
结果 = 9,与样例一致(n=3 时序列:1,3,4,9,… 第4个是9)
n=2, k=12(二进制 1100):
i=2: 1 → +2^2=4
i=3: 1 → +2^3=8
结果 = 12,与样例一致。
5. 取模运算
使用快速幂或直接累乘 base = base * n % MOD,边乘边取模。
循环 k 的二进制位直到 k=0。
6. 时间复杂度
每个测试用例 O(log k),总 t ≤ 10^4,k ≤ 10^9,log2(k) ≤ 30,轻松通过。