#include <bits/stdc++.h>
using namespace std;

unsigned long long rd(unsigned long long &x) {
	x ^= (x << 13);
	x ^= (x >> 7);
	x ^= (x << 17);
	return x;
}

constexpr int N=2000000,mod=998244353;
inline void reduce(int &x){if(x>=mod) x-=mod;}
int a[N+10],ans[N+10];
long long qpow(long long a,long long b,long long mod){
	long long m=1;
	while(b){
		if(b&1) m=m*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return m;
}
int n, q, x;
int query(long long k,int x){
	long long tmp,tmp1;
	long long p2=qpow(2,k,n<<1),p21=qpow(2,k,mod);
	int i;
	long long ans=0;
	for(i=0;i<n;++i){
		tmp=(p2*(i+1)+(n<<1)-1-x)%(n<<1);
		tmp1=(p21*(i+1)+mod-1-x-tmp)%mod;
		tmp1=(tmp1*qpow(n<<1,mod-2,mod)+1)%mod;
		ans=(ans+tmp1*(a[i]-a[i+1]+mod))%mod;
	}
	return ans*qpow(2,mod-1-k%(mod-1),mod)%mod;
}
int main() {
	freopen("noodle.in","r",stdin);
	freopen("noodle.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	int test, T;
	unsigned long long seed;
	cin>>test>>T>>seed;
	for(int Case = 1; Case <= T; Case ++) {
		long long k_max;
		cin>>n>>q>>x>>k_max;
		int i;
		for(i=0;i<n;++i) cin>>a[i];
		a[n]=0;
		bool flag=0;
		if(k_max<=q){
			flag=1;
			for(i=0;i<k_max;++i){
				reduce(ans[i]=query(i,x-1)+query(i,(n<<1)-x));
			}
		}
		long long anss=0;
		for(int i = 1; i <= q; i ++) {
			long long k = rd(seed) % k_max;
			if(flag) anss^=(long long)ans[k]*i;
			else anss^=(long long)(query(k,x-1)+query(k,(n<<1)-x))%mod*i;
		}
		cout<<anss<<'\n';
	}
}
