洛谷P2558 [AHOI2002] 网络传输 题解
题意:
在计算机网络中所有数据都是以二进制形式来传输的。但是在进行较大数据的传输时,直接使用该数的二进制形式加以传输则往往传输的位数过多。譬如要传输 $1024$ 就需要 $11$ 位二进制数。于是小可可提出了一种数据优化传输的设想,并打算对这一设想进行试验。
该设想是:正整数的所有方幂以及任意多个互不相等的 $k$ 的方幂之和排成一个递增数列 $\{a(k)n\}$,例如当 $k=3$ 时,$\{a(k)n\}$ 的前 $7$ 项为 $1(=3^0)$ 、 $3(=3^1)$ 、 $4(=3^0+3^1)$ 、 $9(=3^2)$ 、 $10(=3^0+3^2)$ 、 $12(=3^1+3^2)$ 、 $13(=3^0+3^1+3^2)$。
如果数 $d$ 是数列 $\{a(k)n\}$ 中的第 $p$ 项,则可以通过传送 $k$ 和 $p$ 这两个数来表示数 $d$。由于 $k$ 和 $p$ 这两个相对很小的数就可以表达出很大的数,因而理论上可以减少网络传输的位数。
小可可现在请你编写程序把接收到的数 $k$ 和 $p$ 所代表的数 $d$ 计算出来。
输入格式:
文件中以一行的形式存放了两个正整数 $k$ 和 $p$,$1<k \le 1024$,$1 \le p \le 1024$。
输出格式:
以一行的形式输出问题的解(解的位数不超过 $50$ 位)。
还以为是什么格雷码,结果是个自创的编码方式。
题目讲的也不清楚,只能仔细观察它的构成,容易发现(以下 $i\ge 1$ )
- 对于 $i~(2^k < i < 2^{k + 1})$ 有 $f_i = f_{i\bmod k}+f_k$ 。
- 对于 $i = 2^k$ 有 $f_i = a^k$ 。
注意本题需要高精度,当然我肯定不高兴打高精的,直接上 python 。
时间复杂度 $\mathcal{O}(n)$
代码:
a, b = map(int, input().split())
f = []; base = 1; now = 0; num = 0;
while True:
f.append(base)
num += 1
now = num
base *= a
for i in range(0, now - 1):
f.append(f[now - 1] + f[i])
num += 1
if num >= b:
print(f[b - 1])
break
参考文献:
[1] https://www.luogu.com.cn/article/o3zw1bt4
题外话:
原来 python 没有自增运算符啊,白学了。