const int MAXN=1e6+5,MAXM=1<<16,Mod=998244353;
LL a[MAXN];
vector<LL> c[4][MAXM];
uint64_t G(uint64_t x){
x^=x<<13;
x^=x>>7;
x^=x<<17;
return x;
}
bool check(LL x){
int cnt=0;
_for(i,0,64){
if((x>>i)&1)
cnt++;
}
return cnt<=3;
}
int main()
{
int n=read_int(),m=read_int();
a[0]=read_LL();
_for(i,1,n)a[i]=G(a[i-1]);
_for(i,0,n){
_for(j,0,4)
c[j][(a[i]>>(16*j))&((1<<16)-1)].push_back(a[i]);
}
int ans=0;
while(m--){
LL b=read_LL();
bool flag=false;
_for(i,0,4){
int t=(b>>(16*i))&((1<<16)-1);
_for(j,0,c[i][t].size()){
if(check(c[i][t][j]^b)){
flag=true;
break;
}
}
if(flag)
break;
}
ans=(ans<<1|flag)%Mod;
}
enter(ans);
return 0;
}