#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2000010,mod=998244353,iv2=(mod+1)/2;
typedef unsigned long long ull;
unsigned long long rd(unsigned long long &x) {
	x ^= (x << 13);
	x ^= (x >> 7);
	x ^= (x << 17);
	return x;
}
void add(int &x,int y){x=(x+y>=mod?x+y-mod:x+y);}
int test,T,a[N];ull seed;
namespace brute1{
	const int N=510;
	int f[N][N];
	void solve(int n,int q,int x,int k)
	{
		for(int i=1;i<=n;i++) f[0][i]=a[i];
		for(int t=1;t<=k;t++)
			for(int j=1;j<=n;j++)
				f[t][j]=1ll*(f[t-1][(j+1)/2]+f[t-1][n-(j+1)/2+1])*iv2%mod;
		ull ans=0;
		for(int i=1;i<=q;i++)
		{
			int v=rd(seed)%k;
			ans^=(ull)f[v][x]*i;
		}
		printf("%llu\n",ans);
	}
}
namespace brute2{
	int f[11][N];
	void solve(int n,int q,int x,int k)
	{
		for(int i=1;i<=n;i++) f[0][i]=a[i];
		for(int t=1;t<=k;t++)
			for(int j=1;j<=n;j++) f[t][j]=1ll*(f[t-1][(j+1)/2]+f[t-1][n-(j+1)/2+1])*iv2%mod;
		ull ans=0;
		for(int i=1;i<=q;i++)
		{
			int v=rd(seed)%k;
			ans^=(ull)f[v][x]*i;
		}
		printf("%llu\n",ans);
	}
}
namespace brute3{
	int f[N],tmp[N],g[24];
	void solve(int n,int q,int x,ull k)
	{
		--x;
		for(int i=0;i<n;i++) f[i]=a[i+1];
		g[0]=f[x];
		int mx=0;
		for(mx=1;mx<=23;mx++)
		{
			if(n==1){--mx;break;}
			for(int j=0;j<n/2;j++) f[j]=1ll*(f[j]+f[n-j-1])*iv2%mod;
			n/=2,x/=2;
			g[mx]=f[x];
		}
		ull ans=0;
		for(int i=1;i<=q;i++)
		{
			ull v=rd(seed)%k;
			if(v>(ull)mx) v=mx;
			ans^=(ull)g[v]*i;
		}
		printf("%llu\n",ans);
	}
}
namespace brute4{
	const int N=250;
	struct matrix{
		int a[N][N];
		matrix(){memset(a,0,sizeof(a));}
		int* operator [](int x){return a[x];}
	}o;
	int m,f[N];
	matrix operator *(matrix a,matrix b)
	{
		matrix c;
		for(int i=0;i<m;i++)
			for(int k=0;k<m;k++)
				for(int j=0;j<m;j++)
				c[i][j]=(c[i][j]+1ll*a[i][k]*b[k][j])%mod;
		return c;
	}
	matrix ksm(matrix a,int k)
	{
		matrix b;
		for(int i=0;i<m;i++) b[i][i]=1;
		for(;k;k>>=1,a=a*a) if(k&1) b=b*a;
		return b;
	}
	int get_ans(matrix a,int x)
	{
		int res=0;
		for(int i=0;i<m;i++) res=(res+1ll*a[x][i]*f[i])%mod;
		return res;
	}
	void solve(int n,int q,int x,ull k)
	{
		int a0=a[x];
		for(int i=0;i<n/2;i++) f[i]=1ll*(a[i+1]+a[n-i])*iv2%mod;
		--x;x/=2;n/=2;
		m=n;
		o=matrix();
		for(int i=0;i<m;i++) add(o[i][i/2],iv2),add(o[i][n-i/2-1],iv2);
		ull ans=0;
		for(int i=1;i<=q;i++)
		{
			ull v=rd(seed)%k;int res=0;
			if(v==0) res=a0;
			else res=get_ans(ksm(o,v-1),x);
			ans^=(ull)res*i;
		}
		printf("%llu\n",ans);
	}
}
int main()
{
	freopen("noodle.in","r",stdin);
	freopen("noodle-.out","w",stdout);
	scanf("%d%d%llu",&test,&T,&seed);
	while(T --> 0)
	{
		int n,q,x;ull k;scanf("%d%d%d%llu",&n,&q,&x,&k);
		for(int i=1;i<=n;i++) scanf("%d",&a[i]);
		brute1::solve(n,q,x,k);
	}
	return 0;
}
