嘘~ 正在从服务器偷取页面 . . .

洛谷P2558 [AHOI2002] 网络传输 题解


洛谷P2558 [AHOI2002] 网络传输 题解

题目链接: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 没有自增运算符啊,白学了。


文章作者: q779
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 q779 !
评论
  目录