分析
求集合中所有子集异或和
因为是异或运算所以要使贡献为 $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);
}
}