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

洛谷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 !
评论
  目录