#include #include #include #include #include #include #include #include #include #include #include #define M 500005 using namespace std; vectoredge[M]; int dp[M][11],dp1[M][11]; int st=0,max_dep=0; void dfs(int x,int fa,int K){ dp[x][0]=1; int j,k; int cnt=0,tot=0; for(j=0;j=2;k--) dp[to][k]+=dp[x][k-1]-dp[to][k-2]; dp[to][1]++; dfs1(to,x,K); } } int main(){ int T; scanf("%d",&T); while(T--){ memset(dp,0,sizeof(dp)); memset(dp1,0,sizeof(dp1)); int n,k,j,K,a,b; scanf("%d%d%d%d",&n,&K,&a,&b); for(j=1;j<=n;j++) edge[j].clear(); for(j=2;j<=n;j++){ int fa=(1LL*a*j+b)%(j-1LL)+1; //printf("%d %d\n",j,fa); edge[j].push_back(fa); edge[fa].push_back(j); } dfs(1,0,K); dfs1(1,0,K); //printf("dp = %d\n",dp[1][1]); int ans=0; for(j=1;j<=n;j++){ int now=0; for(k=0;k<=K;k++){ now+=dp[j][k]; } //printf("%d %d\n",j,now); ans^=now; } printf("%d\n",ans); } //system("pause"); return 0; }