#P4067. [SDOI2016] 储能表

[SDOI2016] 储能表

题目描述

有一个 nnmm 列的表格,行从 00n1n-1 编号,列从 00m1m-1 编号。每个格子都储存着能量。最初,第 ii 行第 jj 列的格子储存着 (ij)(i \oplus j) 点能量(\oplus 表示按位异或)。所以,整个表格储存的总能量是

i=0n1j=0m1ij\sum_{i=0}^{n-1} \sum_{j=0}^{m-1} i \oplus j

随着时间的推移,格子中的能量会渐渐减少。每经过一个时间单位,每个格子中的能量都会减少 11。显然,一个格子的能量减少到 00 之后就不会再减少了。

也就是说,kk 个时间单位后,整个表格储存的总能量是

$$\sum_{i=0}^{n-1} \sum_{j=0}^{m-1} \max((i \oplus j)-k,0) $$

给出一个表格,求 kk 个时间单位后它储存的总能量。

由于总能量可能较大,输出时对 pp 取模。

输入格式

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

输出格式

TT 行,每行一个数,表示总能量对 pp 取模后的结果。

3
2 2 0 100
3 3 0 100
3 3 1 100
2
12
6

提示

对于 100%100\% 的数据,保证 1T50001\le T\le 50001p1091\le p\le 10^91n,m,k10181\le n,m,k\le 10^{18}

测试点编号 T=T= nn\le mm\le kk\le pp\le
1,21,2 50005000 100100 10910^9
33 101810^{18} 101810^{18} 00
44 11
55 1010 1010
66 11 10510^5 10510^5
77 101810^{18} 101810^{18}
88 100100
9,109,10 50005000

Statement fixed by Starrykiller.\texttt{Statement fixed by Starrykiller.}