A
注意到 \(a[i]\) 可以异或上任意多次 \(a[1 \to i - 1]\),于是 求出 \(1\to i - 1\) 的线性基 \(V\),能变成数的个数是 \(2^{|V|}\)。
// Sparkle
#include <bits/stdc++.h>
#include <assert.h>
using namespace std;
typedef long long ll;
typedef double db;
#define ep emplace_back
#define pii pair<int,int>
#define fi first
#define se second
#define mp make_pair
#define fout freopen("out.out","w",stdout);
#define fin freopen("in.in","r",stdin);
#define dd(x) cerr << #x" = " << x << endl;
inline int read() {
int x=0, v=1,ch=getchar();
while('0'>ch||ch>'9') {
if(ch=='-') v=0;
ch=getchar();
}while('0'<=ch&&ch<='9') {
x=(x*10)+(ch^'0');
ch=getchar();
}return v?x:-x;
}
const int P = 998244353;
int n, p[35], sz;
void ins(int x) {
for(int i = 30; i >= 0; -- i) {
if(x >> i & 1) {
if(p[i]) {
x ^= p[i];
}else {
p[i] = x;
++ sz;
return;
}
}
}
}
int qpow(int x,int p) {
int ret = 1;
for(;p;p>>=1,x=1ll*x*x%P)if(p&1)ret=1ll*ret*x%P;
return ret;
}
signed main() {
n = read();
int ans = 1;
for(int i = 1; i <= n; ++ i) {
int x = read();
ans = 1ll * ans * qpow(2, sz) % P;
ins(x);
}
cout << ans;
return 0;
}
标签:typedef,ch,省选,ret,int,3.4,out,模拟,define
From: https://www.cnblogs.com/Lates/p/17179977.html