题意
有一块长宽都为
N
N
N 的正方形毛皮,它被分为
N
×
N
N × N
N×N 个单位格子,每个格子上填着一个小于
M
M
M 的自然数,其中第
i
i
i 行第
j
j
j 列的格子上的数字是
A
i
,
j
A_{i,j}
Ai,j。
现在这块正方形毛皮上的很多数字已经破损,只能看清
K
K
K 个格子里的数字。但你知道这些数字满足,每行每列的数字之和模
M
M
M 的值全部相等。
求这个正方形毛皮上的数字有多少种可能的情况。两种情况被视为不同,当且仅当
存在一个格子在两种方案中所填的数字不同。输出答案对
1
0
9
+
7
10^{9} + 7
109+7 取模后的值。
对于所有数据,满足 1 ≤ N ≤ 1 0 9 , 0 ≤ K ≤ 1 0 6 , 10 ≤ M ≤ 1 0 9 1 \le N \le 10^{9}, 0 \le K \le 10^{6}, 10 \le M \le 10^{9} 1≤N≤109,0≤K≤106,10≤M≤109,所有给出的二元组 ( i , j ) (i, j) (i,j) 互不相同。
题解
直接在正方形上不好做(考场上容斥想到自闭),考虑对于行列和的限制,把每行每列看作一个点,每个点看作一条连向其所在行和列的边,对于已经确定权值的点直接在其对应行列上记下,于是问题转化为确定一些边的权值,使各个点权加上其连边边权和都为 0 0 0(考场上想到类似的东觉得不可做就弃了)。
假设已知行列分别的和 x x x,先考虑虑一个连通块,按照一般的套路,先考虑其为一棵树的情况。容易发现,要么无解要么有唯一解。如何判断是否有解呢?结合建图的定义,这个连通块之所以会与其他点隔离,是因为其对应的行和列与其列和行之间都没有连边,即对应格子上都有值。考虑把其对应的行、列平移到左上角的矩形,利用有值的格子,可列出关于 x x x的一个同于方程 a i x = b i ( m o d m ) a_ix=bi( mod m) aix=bi(modm) ,满足次方程的任意一个 x x x都能使左上的矩形存在填数方案(可理解为在树上一次确定每一个点后,由于总和是合法的,最后一个点一定是 0 0 0),故满足方程与有解是等价的。而对于不在树上的其他边,随便乱取都不会影响是否有解。
于是对于每个联通块列出一个同于方程,合并一下可求出解的个数,再乘上可乱选的边的方案数即可。注意到在找连通块时要求效率是 O ( K ) O(K) O(K)的,发现当 n > k n>k n>k时整个图一定联通,特判即可;否则用链表维护每个点是否选过,用bfs求出,效率是 O ( k + n ) O(k+n) O(k+n)的。