613 | 2015-12-05 21:16:30
# 3
。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<map>
#include<set>
#include<vector>
#define LL long long
#define LD long double
using namespace std;//%I64d
int fa[1200010],dp[1200010][12],dpans[1200010][12];
int cop[1200010];
int kkkk;
int first[2000100],last[2000100],next[2000100],des[2000100],tt;
void clear(int n)
{
for (int i=1;i<=n;i++) first[i]=last[i]=0;
for (int i=1;i<=tt;i++) next[i]=des[i]=0;
tt=0;
}
void getin(int c,int d)
{
des[++tt]=d;
if (!first[c]) first[c]=last[c]=tt;else last[c]=next[last[c]]=tt;
}
inline void bfs()
{
int head=1,tail=0;cop[1]=1;
while (head!=tail)
{
int s=cop[++tail];
for (int k=first[s];k!=0;k=next[k])
{
cop[++head]=des[k];
}
}
}
inline void getdp(int n)
{
for (int i=0;i<=kkkk;i++)
for (int ii=n;ii>=1;ii--)
{
int s=cop[ii];
if (i==0) {dp[s][0]=1;continue;}
dp[s][i]=0;
for (int k=first[s];k!=0;k=next[k]) dp[s][i]+=dp[des[k]][i-1];
}
for (int i=0;i<=kkkk;i++)
for (int ii=1;ii<=n;ii++)
{
int s=cop[ii];
dpans[s][i]=dp[s][i];
if (fa[s])
{
if (i>=1) dpans[s][i]+=dp[fa[s]][i-1];
if (i>=2) dpans[s][i]-=dp[s][i-2];
}
if (i) dpans[s][i]+=dpans[s][i-1];
}
}
int main()
{
int t;scanf("%d",&t);
while (t--)
{
int n,ai,bi;scanf("%d%d%d%d",&n,&kkkk,&ai,&bi);
clear(n);
fa[1]=0;
for (int i=2;i<=n;i++) {fa[i]=((long long)ai*(long long)i+(long long)bi)%((long long)i-1)+1;getin(fa[i],i);}
bfs();
getdp(n);
int ans=0;
for (int i=1;i<=n;i++)
{
int p=0;
p+=dpans[i][kkkk];
ans^=p;
}
printf("%d\n",ans);
}
}