时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld
题目描述
本题与《E. move (Easy Version)》共享部分题目背景,这一部分文本我们将使用特殊的格式加以标注。
〖引用开始〗

给定一个长为

宽为

的矩阵

,其中矩阵中每个格子都有一个权值,第

行第

列的权值记为

,现在你能够执行以下两种操作之一:

选择矩阵中某个位置
)
,令
%7D%5Cright))
、
%7D%5Cright))
,使得

、
%7D%3A%3Dv)
。

选择矩阵中某个位置
)
,令
%2Cj%7D%5Cright))
、
%2Cj%7D%5Cright))
,使得

、
%2Cj%7D%3A%3Dv)
。
〖引用结束〗

你
需要构造一个从列下标

中选取
)
个数构成的集合

,记剩余

个数构成的集合为

,
使得能通过若干次上述操作(可以为零次),将矩阵

变成满足以下条件的新矩阵:

对于任意的

、
![i\in[1,n]](https://www.nowcoder.com/equation?tex=i%5Cin%5B1%2Cn%5D)
,满足

;

对于任意的

、
![i\in[1,n]](https://www.nowcoder.com/equation?tex=i%5Cin%5B1%2Cn%5D)
,满足

;

如果有多个这样的集合

满足要求,找出
字典序最大的一个。随后,求解该字典序最大化的集合

所需要的将矩阵

变成满足条件的新矩阵的最少操作次数(不需要输出具体的构造);如果没有满足要求的集合

,则输出

。
【名词解释】


:指位运算中的按位或(Bitwise OR),对两个整数的二进制表示按位进行或运算。


:指位运算中的按位与(Bitwise AND),对两个整数的二进制表示按位进行与运算。

集合的
字典序比较:将集合元素升序排列后,从小到大逐个比较两个集合的元素。如果在某个位置上元素不同,比较这两个元素的大小,元素大的集合字典序也大。如果一直比较到其中一个集合结束,则长度较长的集合字典序更大。
输入描述:
第一行输入两个整数
,分别表示矩阵的长和宽。
此后
行,第
行输入
个整数
,表示矩阵中第
行的权值。
输出描述:
如果有满足条件的字典序最大化的集合
,则输出该集合所需要的将矩阵
变成满足条件的新矩阵的最少操作次数;否则输出
。
示例2
说明
在这个样例中,不需要任何操作就能满足要求。
示例3
说明
在这个样例中,找不到任何的集合
满足要求。
示例4
输入
复制
10 10
0 0 0 0 0 1 1 1 0 0
1 0 0 0 0 1 1 1 1 1
1 1 0 1 1 0 1 0 0 0
1 1 1 0 0 0 1 0 0 0
0 1 0 1 0 1 0 1 0 1
0 1 0 1 1 0 1 1 1 0
0 0 1 0 1 0 1 0 0 1
0 1 1 0 1 0 1 1 1 0
0 1 0 0 0 0 1 1 1 0
0 1 1 1 0 1 1 0 1 1