#P4067. [SDOI2016] 储能表

[SDOI2016] 储能表

题目描述

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

∑i=0n−1∑j=0m−1i⊕j\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\% 的数据,保证 1≤T≤50001\le T\le 5000,1≤p≤1091\le p\le 10^9,1≤n,m≤1018,0≤k≤10181\le n,m\le 10^{18},0\le k\le 10^{18}。

::cute-table{tuack}

测试点编号 T=T= n≤n\le m≤m\le k≤k\le p≤p\le
1,21,2 50005000 100100 10910^9
33 ^ 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.}