/**
Problem A. Ascending Rating
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6319
题意:给定一个序列a 对于每个长度为m的连续子串中,求出区间a的最大值和从左往右扫描是该区间a的最大值的变化次数与当前节点异或值得和;
首先顺着求解是比较困难的 ,因此 考虑倒着求解每个区间的答案
按照滑动窗口最大值大经典方法维护a的单调队列,那么队列元素的个数就是最大值变化次数;
*/
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e7+7;
int T,n,m,k,P,Q,R,MOD,a[N],q[N],h,t;
int main(){
scanf("%d",&T);
while(T--){
scanf("%d %d %d %d %d %d %d",&n,&m,&k,&P,&Q,&R,&MOD);
for(int i=1;i<=k;i++) scanf("%d",&a[i]);
for(int i=k+1;i<=n;i++) a[i]=(1LL*P*a[i-1]+1LL*Q*i+R)%MOD;
int h=1;ll t,A,B;t=A=B=0;
for(int i=n;i>=1;i--){
while(h<=t&&a[q[t]]<=a[i]) t--;
q[++t]=i;
if(i+m-1<=n){
while(q[h]>=i+m) h++;
A+=i^a[q[h]];
B+=i^(t-h+1);
}
}
printf("%lld %lld\n",A,B);
}
return 0;
}