专栏文章

题解:P6962 [NEERC 2017] Knapsack Cryptosystem

P6962题解参与者 2已保存评论 1

文章操作

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

当前评论
1 条
当前快照
1 份
快照标识符
@miqdorpb
此快照首次捕获于
2025/12/04 03:06
3 个月前
此快照最后确认于
2025/12/04 03:06
3 个月前
查看原文
超绝值域分治。
考虑 n42n\le 42 时,我们可以暴力 meet-in-the-middle,把 nn 个数分成个数尽量相等的两堆,每堆里枚举子集,把该子集中数的和记录在一个哈希表中。然后枚举第一堆的哈希表里的值 xx,查询第二堆的哈希表中是否存在 sxs-x。若存在则输出。复杂度 O(2n2)O(2^{\frac{n}{2}})(使用 unordered_map,近似 O(1)O(1))。
n>42n>42,则根据题面中给定的 {a}\{a\} 的生成方式,不难得出结论:a1264n26443=221a_1\le 2^{64-n}\le 2^{64-43}=2^{21}。那么我们枚举真正的 a1a_1 的复杂度是可以接受的。枚举 a1a_1 后就能得到一系列可能的 rr 使得 a1×rb1(mod264)a_1\times r \equiv b_1 \pmod {2^{64}}。因为保证 rr2642^{64} 互质,意味着 rr 存在逆元,确定 rr 后就能还原出整个 {a}\{a\}。此时判定一下还原后的序列是否合法即可。若合法且存在解就输出(由于 aa 的某一项必然大于前面的项的和,易证若有解必为唯一解,构造方式是从大往小贪心,如果能减就减)。
现在的问题在于求出一个 a1a_1 对应的 rr(们)。我们有式子:
a1×rb1(mod264)a_1\times r \equiv b_1 \pmod {2^{64}}
b1=2k×pb_1=2^k\times p,其中 pp 是奇数,那么此式等价于:
a12k×rp(mod264k)\dfrac{a_1}{2^k}\times r \equiv p \pmod {2^{64-k}}
这个式子告诉我们, 2ka12^k\mid a_1。因此合法的 a1=x×2k,x[1,264nk]a_1=x\times2^k,x\in[1,2^{64-n-k}],只有 264nk2^{64-n-k} 种。
由于我们想要从 {b}\{b\} 还原出 {a}\{a\},所以其实我们只关心 rr 的逆元 r1r^{-1} 的值。将上式变形:
a12kp×r1(mod264k)\dfrac{a_1}{2^k}\equiv p \times r^{-1}\pmod {2^{64-k}} r1a12k×p1(mod264k)r^{-1}\equiv \dfrac{a_1}{2^k} \times p^{-1}\pmod {2^{64-k}}
其中,ppb1b_1 确定,即是一个确切值;同时 pp 一定是奇数,因此 p1p^{-1} 一定存在且固定。
因此只要确定了 a1a_1,就确定了 r1mod264k=a12k×p1r^{-1} \bmod {2^{64-k}}=\dfrac{a_1}{2^k} \times p^{-1}。也即,r1=y×264k+a12k×p1,y[0,2k)r^{-1}=y\times 2^{64-k}+\dfrac{a_1}{2^k} \times p^{-1}, y\in [0,2^{k})
因此对于一个 a1a_1,合法的 rr 的数量是 2k2^k 种。整体上合法的 (a1,r)(a_1,r) 数对就只有 264nk×2k=264n2^{64-n-k}\times 2^k=2^{64-n} 种情况。每种情况在得到 r1r^{-1} 后的判定是 O(n)O(n) 的,因此总复杂度为 O(n×264n)O(n\times2^{64-n})
42<n6442<n\le 64 时,这个值在 n=43n=43 时取极大值 43×221=9017753643\times 2^{21}=90177536,是 9×1079\times 10^7 的量级,常数较小的实现方式可以轻松通过。

评论

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

正在加载评论...