这道题最快速的方法就是利用0异或任何数都不会改变任何数的值的性质(0 ^ a = a),得到(n-1)个0异或n = n,n%n=0,所以数组只需要前n-1个数为0,第n个数为1即可解题
本人在这里给出自己的方法,虽然很拙笨,但也是自己亲自探索出来的规律(一般通过率高的题都有规律可以利用):
规律:对于n为奇数,一种答案是最后一个元素必等于n,然后前n-1个元素全部取n-1即可(n-1是个偶数,偶数个相同的数进行异或,同归于尽,a^a = 0),最后0^n=n(其实我在想到这里的时候就能和其他题解思路殊途同归)
对于n为偶数,
当n=4, 最后两个元素取:3 5 得011^101=110=4; 4%4=0
当n=6,最后两个元素取:5 7 得101^111=010=2; 6%2=0
当n=8,最后两个元素取:7 9 得0111^1001=1110=12; 8%12!=0
此番探索虽然不能证明对于n为偶数时:让最后两个元素直接取n-1,n+1,前面n-2(偶数)个元素取n-2就是答案,
但是能够证明奇数和奇数相异或,结果必为偶数。
那么我们只需要让前n-2个元素为0(0^0=0),最后两个元素为1,3就能处理n为偶数的情况
#include <ios>
#include <iostream>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
if (n%2!=0) { // n为奇数
for (int i = 0; i < n-1; i++) {
cout << n-1 << " ";
}// 前n-1项全输出n-1
cout << n << '\n';
}
else { // n为偶数
for (int i = 0; i < n-2; i++) {
cout << 0 << " ";
}
cout << 1 << " " << 3 << '\n';
}
}
}

京公网安备 11010502036488号