#include <bits/stdc++.h>
using namespace std;
const int maxn=2000001,mo=998244353;
int a[maxn];
unsigned long long rd(unsigned long long &x) {
    x ^= (x << 13);
    x ^= (x >> 7);
    x ^= (x << 17);
    return x;
}
int n, q, x;
long long que[maxn];
long long k_max;
int qpow(int a,int b,int res=1){
    for(;b;b>>=1,a=1ll*a*a%mo)if(b&1)res=1ll*res*a%mo;
    return res;
}
namespace brute{
    int ans[maxn],b[maxn];
    void solve(){
        int inv2=qpow(2,mo-2),lm=0;
        ans[0]=a[x];
        for(int i=1;i<=k_max;i++){
            for(int j=1;j<=n/2;j++)b[j]=(a[j]+a[n-j+1])%mo;
            for(int j=1;j<=n;j++)a[j]=1ll*b[(j+1)/2]*inv2%mo;
            ans[i]=a[x];
            lm=i;
            int fl=0;
            for(int j=1;j<=n;j++)
                if(a[j]!=a[1])fl=1;
            if(!fl)break;

        }
        long long res=0;
        for(int i=1;i<=q;i++){
            if(que[i]<=lm){
                res^=ans[que[i]]*i;
            }
            else{
                res^=ans[lm]*i;
            }
        }
        printf("%lld\n",res);
    }
}
namespace matrix{
    const int maxn=505;
    struct vec{
        vec(){memset(c,0,sizeof(c));}
        int c[maxn];
    };
    struct mat{
        int c[maxn][maxn];
        mat(){
            memset(c,0,sizeof(c));
        }
        mat operator * (mat a){
            mat res;
            for(int i=1;i<=n;i++){
                for(int k=1;k<=n;k++){
                    for(int j=1;j<=n;j++)(res.c[i][j]+=1ll*c[i][k]*a.c[k][j]%mo)%=mo;
                }
            }
            return res;
        }
        vec operator * (vec a){
            vec res;
            for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){
                (res.c[i]+=1ll*c[i][j]*a.c[j]%mo)%=mo;
            }
            return res;
        }
    }B[64];
    void solve(){
        int inv2=qpow(2,mo-2),lm=0;
        B[0]=mat();
        for(int i=1,j=1;j<=n;i++,j+=2){
            B[0].c[j][i]=inv2;
            B[0].c[j][n-i+1]=inv2;
            B[0].c[j+1][i]=inv2;
            B[0].c[j+1][n-i+1]=inv2;
        }
        for(int i=1;i<=63;i++){
            B[i]=B[i-1]*B[i-1];
        }
        long long ans=0;
        for(int i=1;i<=q;i++){
            vec cur;for(int i=1;i<=n;i++)cur.c[i]=a[i];
            for(int k=0;k<=63;k++){
                if(que[i]>>k&1)cur=B[k]*cur;
            }
            ans^=(cur.c[x]*i);
        }
        printf("%lld\n",ans);
    }
}
int main(){
    freopen("noodle.in","r",stdin);
    freopen("noodle.out","w",stdout);
    int test,T;
    unsigned long long seed;
    scanf("%d%d%llu",&test,&T,&seed);
    for(int c=1;c<=T;c++){
        scanf("%d%d%d%lld",&n,&q,&x,&k_max);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        for(int i=1;i<=q;i++)que[i]=rd(seed)%k_max;
        if(test<=3)brute::solve();
        else matrix::solve();
    }
}

