#include<bits/stdc++.h>
using namespace std;
const int N=2e6+5,M=510,mod=998244353;
int id,t,n,q,x,a[N],iv2=(mod+1)/2;
long long k_max,k,ans;
unsigned long long seed;
unsigned long long rd(unsigned long long &x){
	x^=(x<<13),x^=(x>>7),x^=(x<<17);
	return x;
}
namespace force{
	int b[N],res[M][M],res2[51][N];
	void get(){
		for(int i=1;i<=n/2;i++) b[i]=(a[i]+a[n-i+1])%mod;
		for(int i=1;i<=n;i++) a[i]=1ll*iv2*b[(i+1)/2]%mod;
	}
	void work(){
		if(n>500){
			for(int i=1;i<=n;i++) scanf("%d",&a[i]),res2[0][i]=a[i];
			for(int i=1;i<k_max;i++){
				get();
				for(int j=1;j<=n;j++) res2[i][j]=a[j];
			}
			for(int i=1;i<=q;i++)
				k=rd(seed)%k_max,ans^=1ll*res2[k][x]*i;
			printf("%lld\n",ans);
			return ;
		}
		for(int i=1;i<=n;i++) scanf("%d",&a[i]),res[0][i]=a[i];
		for(int i=1;i<k_max;i++){
			get();
			for(int j=1;j<=n;j++) res[i][j]=a[j];
		}
		for(int i=1;i<=q;i++)
			k=rd(seed)%k_max,ans^=1ll*res[k][x]*i;
		printf("%lld\n",ans);
	}
} 
struct mat{
	int n,m,x[155][155];
	friend mat operator*(mat a,mat b){
		mat c;
		c.n=a.n,c.m=b.m;
		for(int i=1;i<=c.n;i++)
			for(int j=1;j<=c.m;j++){
				c.x[i][j]=0;
				for(int k=1;k<=c.m;k++)
					c.x[i][j]=(c.x[i][j]+1ll*a.x[i][k]*b.x[k][j]%mod)%mod;
			}
		return c;
	}
}tmp,res,f[60];
mat qpow(int k){
	for(int i=1;i<=n;i++) res.x[1][i]=a[i];
	for(int i=0;(1<<i)<=k;i++)
		if(k>>i&1) res=res*f[i];
	return res;
}
signed main(){
	freopen("noodle.in","r",stdin);
	freopen("noodle.out","w",stdout);
	scanf("%d%d%llu",&id,&t,&seed);
	while(t--){
		scanf("%d%d%d%lld",&n,&q,&x,&k_max),ans=0;
		if(n>50){force::work();continue;}
		for(int i=1;i<=n;i++) scanf("%d",&a[i]);
		tmp.n=tmp.m=res.m=n,res.n=1;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++) tmp.x[i][j]=0;
		for(int i=1,j;i<=n;i++)
			j=(i+1)/2,tmp.x[j][i]=tmp.x[n-j+1][i]=iv2; 
		f[0]=tmp;
		for(int i=1;(1<<i)<=k_max;i++) f[i]=f[i-1]*f[i-1];
		for(int i=1;i<=q;i++)
			k=rd(seed)%k_max,ans^=1ll*qpow(k).x[1][x]*i;
		printf("%lld\n",ans);
	}
	//fprintf(stderr,"time=%.4lf\n",(double)clock()/CLOCKS_PER_SEC);
	return 0;
}
