[SDOI2016] 储能表

题目描述

有一个 $n$ 行 $m$ 列的表格,**行从 $0$ 到 $n-1$ 编号,列从 $0$ 到 $m-1$ 编号**。每个格子都储存着能量。最初,第 $i$ 行第 $j$ 列的格子储存着 $(i \oplus j)$ 点能量($\oplus$ 表示**按位异或**)。所以,整个表格储存的总能量是 $$\sum_{i=0}^{n-1} \sum_{j=0}^{m-1} i \oplus j$$ 随着时间的推移,格子中的能量会渐渐减少。每经过一个时间单位,每个格子中的能量都会减少 $1$。显然,**一个格子的能量减少到 $0$ 之后就不会再减少了。** 也就是说,$k$ 个时间单位后,整个表格储存的总能量是 $$\sum_{i=0}^{n-1} \sum_{j=0}^{m-1} \max((i \oplus j)-k,0)$$ 给出一个表格,求 $k$ 个时间单位后它储存的总能量。 由于总能量可能较大,输出时对 $p$ 取模。

输入输出格式

输入格式


第一行一个整数 $T$,表示数据组数。接下来 $T$ 行,每行四个整数 $n,m,k,p$。

输出格式


共 $T$ 行,每行一个数,表示总能量对 $p$ 取模后的结果。

输入输出样例

输入样例 #1

3
2 2 0 100
3 3 0 100
3 3 1 100

输出样例 #1

2
12
6

说明

对于 $100\%$ 的数据,保证 $1\le T\le 5000$,$1\le p\le 10^9$,$1\le n,m,k\le 10^{18}$。 | 测试点编号 | $T=$ | $n\le$ | $m\le$ | $k\le$ | $p\le$ | | :--: | :--: | :--: | :--: | :--: | :--: | | $1,2$ | $5000$ | $100$ | $100$ | $100$ | $10^9$ | | $3$ | $5000$ | $10^{18}$ | $10^{18}$ | $0$ | $10^9$ | | $4$ | $5000$ | $10^{18}$ | $10^{18}$ | $1$ | $10^9$ | | $5$ | $5000$ | $10$ | $10^{18}$ | $10$ | $10^9$ | | $6$ | $1$ | $10^5$ | $10^{18}$ | $10^5$ | $10^9$ | | $7$ | $1$ | $10^{18}$ | $10^{18}$ | $10^{18}$ | $10^9$ | | $8$ | $100$ | $10^{18}$ | $10^{18}$ | $10^{18}$ | $10^9$ | | $9,10$ | $5000$ | $10^{18}$ | $10^{18}$ | $10^{18}$ | $10^9$ | $\texttt{Statement fixed by Starrykiller.}$