Walk on Matrix

Walk on Matrix

Walk on Matrix 题目链接

思路

我们先想一下有没有可能存在一种特殊情况,用题目的algorithm算的的结果是0,而我们的正确答案是k。

于是我们有了如下构造

其中A的各个位上都是1,\(B = \bar{A} + \bar{K}\),也就是异或,这里的加号是逻辑上的或,\(C = K\)

所以有两条路到D

  • \(A->B->D\),其值为\(A(\bar {A} + \bar {K})D = \bar {K}D\)
  • \(A->C->D\),其值为\(AKD = KD\)

要使其中的一个为零一个为K,则\(D = \bar {K}\)

我们考虑走到B时,\(B =A(\bar {A} + \bar {K})\),走到C时,\(C =\ K\),接下来我们考虑如何变化能使B > C

我们对B,C同时与上一个A得到\(B =\bar {A} + \bar {K}, C = K\),我们知道K是小于1e5的所以k最高位是16位,而A的有17位,我们明显得到\(B =\bar {A} + \bar {K} > C = K\)

于是我们有了一个2 * 3的特殊矩阵。

\(A, \ \bar{A} + \bar {K}, A\)

\(K,\ A,\ K\)

代码

这道题目真是构造了一个多小时啊。

#include<bits/stdc++.h>
using namespace std;
int main() {
    int k;
    cin >> k;
    cout << 2 << " " << 3 << "\n";
    cout << ((1 << 18) - 1) << " " << (((1 << 18) - 1) ^ k) << " " << ((1 << 18) - 1) << "\n";
    cout << k << " " << ((1 << 18) - 1) << " " << k << "\n";
    return 0 ;
}
posted @ 2020-04-29 15:53  lifehappiness  阅读(55)  评论(0编辑  收藏  举报