题目要求我们验证对于任意一对下标 i 和 j,等式 ai⊕aj=i⊕j 是否恒成立。
如果我们直接遍历所有的下标对 (i,j) 来进行检查,时间复杂度将是 O(n2)。考虑到 n 的最大值可以达到 2×106,O(n2) 的算法显然会超时,因此我们需要寻找一个更高效的方法。
我们可以对给定的等式进行变形。按位异或运算有一个很好的性质:x⊕y=z⇔x⊕z=y。我们可以利用这个性质来简化条件。
将等式 ai⊕aj=i⊕j 的两边同时异或上 i 和 j:
小红得到了一个长为n 的数组a1,a2,.,an,他想知道是否对于所有的下标i,j(1≦i,j≦n),都满足等式ai⊕aj=i⊕j成立.
按位异或(⊕):两个整数的二进制表示按位进行异或运算。
每个测试文件均包含多组测试数据。第一行输入一个整数T(1≦T≤103)代表数据组数,每组测试数据描述如下:
第一行输入一个整数n(1≦n≦2×105)。
第二行输入n个正整数a1,a2,..,an(1≦ai≦109)代表数组的元素。
除此之外,保证单个测试文件的n之和不超过2×106
对于每一组测试数据,新启一行。如果符合要求,输出Yes,否则输出No
输入
2
5
7 4 5 2 3
1 1 4 5 1 4
输出
Yes
No