EqualSums
作者:穆皓远 钟知闲
关键词: 排列 容斥原理 建图 枚举 不等式
题目简述
求满足如下条件的n行n列矩阵a的个数:
1.所有元素非负,即
2.对于任意两个大小为n的排列p,q,有
3.满足若干个形如的条件
答案对1e9+7取模
题目保证不会有无穷多个解
算法一
排列可以转化为若干个对换,条件2可化简为,即
容易发现可以由和唯一确定
但是这样并不容易解决非负的限制,考虑设
事实上,对于一个特定的,这样的有无数对,我们取作为解
由,可得
所以只需均非负,条件1也就迎刃而解
对于条件3,我们可以使用一个常用技巧,连边来表示约束,这样对于每个连通块分别求解再相乘就是答案
而对于每个连通块,我们任取一个元素,枚举它的大小(注意大小不会超过),同时判整个连通块是否合法即可
不过到此为止我们并未保证,考虑使用容斥原理,用类似的做法减掉的情况即可
时间复杂度
空间复杂度
算法二
算法一最后涉及枚举元素,与的大小相关,可以考虑设出连通块某个元素,再将其它元素用该元素表示,直接解出该元素的范围即可
时间复杂度
空间复杂度
算法三
以上两种算法均可用并查集替换掉搜索,不过输入本身就是的所以意义不大……
算法四
考虑一种新的想法。
首先根据之前的结论,条件2等效于对任意 ,每一行 的 都相同。转化完以后我们就不需要行数和列数相同的条件了。
既然这题最麻烦的是非负性限制,那么能不能通过调整矩阵使问题变简单呢?假如有一列 有两个位置 非空(非空的意思是存在条件3的约束),其中 ,这时候行 的每一列的数都不比行 小(意味着不需要对行 限制非负性,只限制了列的差),能不能直接把行 合并到行 里面去呢?
可以!如果已确定了 ,那么就确定了 ,一旦矛盾或出负数则无解返回 。之后就可以把行 删掉了。也许你会问:这样会不会丢条件呢?不会!因为这一行不需要约束非负性,所有约束都形如“某两列的差为某定值”,把约束移到行 上,所有约束都保留下来了。这样我们合并一些行使得每列只有一个数确定,再合并一些列使得每行只有一个数(显然不可能有空行或空列,否则有无穷多解)。为了方便处理,把第一行的数所在的列交换到第一列(不难说明交换行列不影响答案)。
现在问题就简单多了。记现在有 行, 为第 列唯一已确定的数, 为第一行第 列的数,这时枚举第一行最左边的最小值位置 ,以 为例,要求 ,,,同时只需对所有 限制 所在行最小值 。化简得到 ,。( 的推导类似)所以方案数为 。
合并行列次数不超过 ,每次需要 时间,计算方案数可以做到 (就算 也没关系),最终复杂度是 。