分析

求集合中所有子集异或

因为是异或运算所以要使贡献为 $1$ ,那么肯定是选奇数个 $1$ 和偶数个$0$。

所以有明显有两种情况

  • 所有的$n$此位都是 $0$ -> 贡献为 $0$

  • 有一个数 $N$ 此位是 $1$ .只需要这位选或是不选,与 $n-1$ 无关,所以所有情况为 $2^{n-1}$

所以最后结果是 $a_i$ 的或和 $\times$ $2^{n-1}$

(一定是或和,因为或计算和这个分类讨论是相同的)

代码也修了很多次

代码

#include<bits/stdc++.h>
using namespace std;
long long a[3000006];
const long long mod=998244353;
inline long long read(){//用着更舒服 
	long long x;
	scanf("%lld",&x);
	return x;
}
signed main() {
//	ios::sync_with_stdio(false);
	long long T=read();
	while (T--) {
		long long n=read();
		long long ans=1,tmp=0;
		for (long long i=1; i<=n; i++) {
			long long huo=read();
			//tmp|=read(); 这样写模拟不到错了/kk 
			tmp|=huo;
			if (i!=1) ans=(ans*2)%mod;
		}
		tmp%=mod;
		printf("%lld\n",(long long)(ans)*(long long)(tmp)%mod);
	}
}