专栏文章

题解:P5461 赦免战俘

P5461题解参与者 10已保存评论 19

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
19 条
当前快照
1 份
快照标识符
@mip0sh41
此快照首次捕获于
2025/12/03 04:17
3 个月前
此快照最后确认于
2025/12/03 04:17
3 个月前
查看原文
声明:这个想法是我在写题解时想到的,由于我很懒某些主观原因无法给出代码。

思路

由于只有 010 1,所以想到了二进制(虽然我不知道为什么要这样想),而且这题数据量很小,于是我决定把矩阵里的 010 1 转化为二进制。
下面看一下 n=3n=3 时右上角的矩阵。
MARKDOWN
0 0 0 1 
0 0 1 1 
0 1 0 1 
1 1 1 1 
第一行 0001=20=10001 = 2^0 = 1
第二行 0011=20+21=30011 = 2^0 + 2^1 = 3
第三行 0101=20+22=50101 = 2^0 + 2^2 = 5
第四行 1111=20+21+22+23=151111 = 2^0 + 2^1 + 2^2 + 2^3 = 15
于是我们惊奇的发现:1,3,5,151,3,5,15 正好是 2412^4-1 的全部因数!
接下来我手动打了一下 n=4n=4 时右上角的矩阵。
MARKDOWN
0 0 0 0 0 0 0 1 
0 0 0 0 0 0 1 1 
0 0 0 0 0 1 0 1 
0 0 0 0 1 1 1 1 
0 0 0 1 0 0 0 1 
0 0 1 1 0 0 1 1 
0 1 0 1 0 1 0 1 
1 1 1 1 1 1 1 1 
88 行分别是:1,3,5,15,17,51,85,2551,3,5,15,17,51,85,255,是 2812^8-1 的全部因数。
所以,我们可以得出结论:对于 2n×2n2^n \times 2^n 的矩阵,除左上的子矩阵外,剩余三个子矩阵每行为 22n112^{2^{n-1}} - 1 的全部因数的二进制形式。
证明以我目前的水平无法给出,希望有大佬补充证明。

#update at 2025.09.15:

证明 by Marnie:
要证明的话,我们可以感觉到其中有一种递推的模式(正解也是递归,递归递推就是正反方向的区别),自然容易想到数学归纳法(一种递推证明的方法)。
怎么递推呢?
  1. 我们希望前一个(即 22n12^{2^n}-1)的因数都能成为下一个数(22n+112^{2^{n+1}}-1)的因数。
  2. 我们希望前一个(即 22n12^{2^n}-1)的因数,左移2^n位后加上自己得到的数都是下一个数(22n+112^{2^{n+1}}-1)的因数。
(比如 0001 变成 00010001, 0011 变成 00110011)。
二进制下左移 xx 位就是乘以 2x2^x,也就是这个操作相当于把 aa 变成 (22n+1)a(2^{2^n}+1)a
于是容易写出证明:
t=2nt=2^n,有:
  1. 22n+11=2t21=(2t+1)(2t1)2^{2^{n+1}}-1=2^{t^2}-1=(2^t+1)(2^t-1)
  2. a(2t1)a|(2^t-1),显然有 a(2t1)(2t+1)a|(2^t-1)(2^t+1)
  3. a(2t1)a|(2^t-1),显然有 (2t+1)a(2t1)(2t+1)(2^t+1)a|(2^t-1)(2^t+1)
这样,递推的两个条件都满足。也就是当该结论对于 n=kn=k 成立时,能推出 n=k+1n=k+1 时也成立。从而对任意n该结论成立。
因为全都是可逆的,假设 aa(2t1)(2t+1)(2^t-1)(2^t+1) 的因数,如果 a÷(2t+1)a\div(2^t+1) 不整除 (2t1)(2^t-1),那么 aa 不整除 (2t1)(2t+1)(2^t-1)(2^t+1),矛盾。
同理 aa(2t1)(2t+1)(2^t-1)(2^t+1) 的因数,如果 aa 不整除 (2t1)(2^t-1),那么 aa 不整除 (2t1)(2t+1)(2^t-1)(2^t+1)
所以这些数一定是(2^2^n)-1的全部因数。
还有,当 n=10n=10 时,22n11=25121=2^{2^{n-1}} - 1 = 2^{512} - 1 =
13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084095\begin{aligned} ‌&1340780792994259709957402499820\\&5846127479365820592393377723561\\&4437217640300735469768018742981\\&6690342769003185818648605085375\\&3882811946569946433649006084095 \end{aligned}
1.34×10155\approx 1.34\times10^{155}
如果你愿意加上高精度和快速幂也可以算,但不建议(应该没有人会这么做)。
时间复杂度 O(4nlogn)O(4^n\log n)
本题解只提供一种思路,当 nn 过大时建议采用分治和递归去做。
大致实现方式:
  1. 分解 251212^{512} - 1,得到全部质因数。
  2. 将因数转换为二进制。
  3. 逐位输出从 11 到第 2n2^n 个因数的二进制形式。

评论

19 条评论,欢迎与作者交流。

正在加载评论...