EqualSums

作者:穆皓远 钟知闲

关键词: 排列 容斥原理 建图 枚举 不等式

题目简述

求满足如下条件的n行n列矩阵a的个数:

1.所有元素非负,即

2.对于任意两个大小为n的排列p,q,有

3.满足若干个形如的条件

答案对1e9+7取模

题目保证不会有无穷多个解

算法一

排列可以转化为若干个对换,条件2可化简为,即

容易发现可以由唯一确定

但是这样并不容易解决非负的限制,考虑设

事实上,对于一个特定的,这样的有无数对,我们取作为解

,可得

所以只需均非负,条件1也就迎刃而解

对于条件3,我们可以使用一个常用技巧,连边来表示约束,这样对于每个连通块分别求解再相乘就是答案

而对于每个连通块,我们任取一个元素,枚举它的大小(注意大小不会超过),同时判整个连通块是否合法即可

不过到此为止我们并未保证,考虑使用容斥原理,用类似的做法减掉的情况即可

时间复杂度

空间复杂度

算法二

算法一最后涉及枚举元素,与的大小相关,可以考虑设出连通块某个元素,再将其它元素用该元素表示,直接解出该元素的范围即可

时间复杂度

空间复杂度

算法三

以上两种算法均可用并查集替换掉搜索,不过输入本身就是的所以意义不大……

算法四

考虑一种新的想法。

首先根据之前的结论,条件2等效于对任意 ,每一行 都相同。转化完以后我们就不需要行数和列数相同的条件了。

既然这题最麻烦的是非负性限制,那么能不能通过调整矩阵使问题变简单呢?假如有一列 有两个位置 非空(非空的意思是存在条件3的约束),其中 ,这时候行 的每一列的数都不比行 小(意味着不需要对行 限制非负性,只限制了列的差),能不能直接把行 合并到行 里面去呢?

可以!如果已确定了 ,那么就确定了 ,一旦矛盾或出负数则无解返回 。之后就可以把行 删掉了。也许你会问:这样会不会丢条件呢?不会!因为这一行不需要约束非负性,所有约束都形如“某两列的差为某定值”,把约束移到行 上,所有约束都保留下来了。这样我们合并一些行使得每列只有一个数确定,再合并一些列使得每行只有一个数(显然不可能有空行或空列,否则有无穷多解)。为了方便处理,把第一行的数所在的列交换到第一列(不难说明交换行列不影响答案)。

现在问题就简单多了。记现在有 行, 为第 列唯一已确定的数, 为第一行第 列的数,这时枚举第一行最左边的最小值位置 ,以 为例,要求 ,同时只需对所有 限制 所在行最小值 。化简得到 。( 的推导类似)所以方案数为

合并行列次数不超过 ,每次需要 时间,计算方案数可以做到 (就算 也没关系),最终复杂度是

results matching ""

    No results matching ""