Kblack loves flag

Accepts: 422
Submissions: 765
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
kblack喜欢旗帜(flag),他的口袋里有无穷无尽的旗帜。

某天,kblack得到了一个$n*m$的方格棋盘,他决定把$k$面旗帜插到棋盘上。

每面旗帜的位置都由一个整数对$\left(x,y \right)$来描述,表示该旗帜被插在了第$x$行第$y$列。

插完旗帜后,kblack突然对那些没有插过旗帜的行和列很不满,于是他想知道,有多少行、列上所有格子都没有被插过旗帜。

kblack还要把妹,于是就把这个问题丢给了你,请你帮他解决。
输入描述
由于本题输入数据较大,所以采取在程序内生成数据的方式。

随机数产生器中有个内部变量$x$初始时为$seed$,$seed$是我们提供的随机种子。每次请求生成一个$\left[l,r \right]$内的随机数时,它会将$x$变为$\left(50268147x+6082187\right)\ mod\ 100000007$,然后返回$x\ mod\ \left(r-l+1 \right)+l$。

输入包含多组数据。第一行有一个整数$T$,表示测试数据的组数,对于每组数据:

输入一行3个整数$n$,$m$,$k$,$seed$分别表示棋盘的行数、列数、棋盘上旗帜的面数、随机种子。

接下来,你需要按顺序生成k面旗帜的位置信息。

对于每面旗帜,依次生成一个$\left[1,n \right]$内的随机数和一个$\left[1,m \right]$内的随机数,分别表示$x$,$y$。

如果你无法理解数据生成的过程,你可以复制以下代码并调用Init函数来生成数据(限C++选手)。

`
const int _K=50268147,_B=6082187,_P=100000007;
int _X;
inline int get_rand(int _l,int _r){
	_X=((long long)_K*_X+_B)%_P;
	return _X%(_r-_l+1)+_l;
}
int n,m,k,seed;
int x[1000006],y[1000006];
void Init(){
	scanf("%d%d%d%d",&n,&m,&k,&seed);
	_X=seed;
	for (int i=1;i<=k;++i)
		x[i]=get_rand(1,n),
		y[i]=get_rand(1,m);
}
`

$\left(1\leq T\leq 7 \right)$,$\left(1\leq n,m\leq 1000000 \right)$,$\left(0\leq k\leq 1000000 \right)$,$\left(0\leq seed<100000007 \right)$
输出描述
对于每组测试数据输出一行2个整数,分别表示没有被插过旗帜的行、列数目。
输入样例
2
4 2 3 233
3 4 4 2333
输出样例
2 1
1 0
Hint
第1组数据的旗帜的位置依次为:$\left(4,2\right)$,$\left(1,2\right)$,$\left(1,2\right)$

第2组数据的旗帜的位置依次为:$\left(2,1 \right)$,$\left(2,3\right)$,$\left(3,4\right)$,$\left(3,2\right)$