洛谷[WC2015] 混淆与破解 题解

思路:这道题其实就是一道逆混淆+代数化简题目。因为题目中限制了有效信息是必须的且不存在不必要的有效信息,所以我们只需要找到那 $m$ 个有效信息,然后通过必要的代数化简就可以得到一个代表 $h$ 函数的查表。而找出那 $m$ 个有效信息我们就需要进行逆向分析。注意到有效信息是通过异或得到的,那么如果采用线性代数的思想,我们就可以找到一个线性变换来将有效信息转化为通用的形式,这个线性变换也可以叫做变量的消元。消元之后就能得到一组简单的线性方程组,根据线性代数的理论我们有 $m$ 个未知数、$m$ 个方程,这组方程组是有整数解的。通过消元之后可以发现,混淆版算法的很多线性式子变得非常简单,但是这个信息我们在后续的代数化简中可以稍微利用一下。当然,因为异或是满足结合律和交换律的,所以这样构造出来的线性变化并不是唯一的,但是至少保证了一组解,而且跑过所有的数据点也不会有问题。

最后,用得到的那组有效信息来求一个 $2^m$ 个元素的查表就可以了。而具体实现中,因为我们知道混淆版算法的函数表达式,所以我们可以通过枚举所有的 $2^n$ 个输入点,然后通过混淆版算法来得到每个点的输出值,然后再将这个输出值映射到 $h$ 函数查表上即可。这样做的时间复杂度大概是 $O(n^{1+\epsilon})$,且在某些数据点上由于编译器和计算机处理的差异可能会导致时间错误地飞升到 $O(2^n)$,但是没有关系,因为如果你的代码跑得奇慢无比的话,那么一定是信息有误,或者做法有误,所以你需要不停地优化。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值