📌  相关文章
📜  门| Sudo GATE 2020 Mock I(2019年12月27日)|第64章(1)

📅  最后修改于: 2023-12-03 15:28:46.227000             🧑  作者: Mango

门 | Sudo GATE 2020 Mock I(2019年12月27日)|第64章

题目描述

有一个门,每次开门需要输入一个由 0 和 1 组成的 n 位二进制密码,门会将密码和一个内置密码 x 进行异或运算,将结果与门内存储的一个二进制数 y 进行比较,若相等则门会打开。

现在我们掌握了门内存储的二进制数 y 和内置密码 x,要求写一个程序来尝试破解门的密码。

输入格式

输入的第一行为一个正整数 t,表示需要尝试 t 次(t ≤ 100)。

接下来的 t 行,每行包含三个整数 n, x, y, 分别表示密码的长度,内置密码 x 和门内存储的二进制数 y (1 ≤ n ≤ 1000)。

输出格式

对于每个测试样例,输出一行一个字符串,表示该密码(若有多个密码,输出任意一个),若无法破解则输出 “门无法打开”。

样例输入
3
3 1 6
3 3 2
2 1 1
样例输出
011
000
门无法打开
说明

对于第一个样例,当密码为 011 或 110 时门会打开。

对于第二个样例,不存在可以打开门的密码。

对于第三个样例,当密码为 00 或 11 时门会打开。

解题思路

这道题目的难点在于数字异或的性质:a ^ b ^ b = a (^ 表示异或)。

因此,我们可以先将内置密码 x 与门内存储的二进制数 y 进行异或运算,得到结果 z = x ^ y,再将得到的结果与每一个 n 位二进制数进行异或运算,判断是否等于 z,若等于则该 n 位二进制数即为该门的密码。

具体实现代码见下:

def solve(n, x, y):
    z = x ^ y
    for i in range(2 ** n):
        if i ^ z == 0:
            return format(i, '0' + str(n) + 'b')
    return '门无法打开'
    
t = int(input())
for _ in range(t):
    n, x, y = map(int, input().split())
    print(solve(n, x, y))
时间复杂度

由于需要尝试 $2^n$ 种可能的密码,因此时间复杂度为 $O(tn2^n)$。

空间复杂度

由于我们只需要存储一个整数 z,因此空间复杂度为 $O(t)$。