我们要在一个 N×M 的矩阵中,为每一行选择“原样(0)”或“整行反转(1)”这两种状态,使得对所有列,同一列上的 N 个数字两两不同。 把每一行的选择记为布尔变量 xi∈{0,1}(0=不翻转,1=翻转)。对于任意两行 i,k 与任意一列 j,如果在某个组合下两行在列 j 的值相等,则该组合被禁止:
有一个密码锁,密码锁是由一个 N×M 的矩阵构成,该密码锁只有在每一列上,每个数均不同的情况下,才能被打开,此外,还可以对矩阵的任意一行上的数字进行翻转操作(每行最多只能翻转一次);若此时仍然无法满打开密码锁的条件,则该密码锁将无法被打开。
现在给出密码锁上的密码矩阵,请你编写一个程序判断是否可以打开该密码锁。
第一行输出矩阵的大小 N,M
随后 N 行 M 列输入密码矩阵上的数字 Xi,j ,第 i 行第 j 列的数字为 Xi,j 。
1≤N,M≤1000
1≤Xi,j≤109
若无法打开密码锁输出 No ;
若可以打开密码锁第一行输出 Yes ,第二行输出需要翻转的行数 n ,第三行,输出 n 个正整数,代表需要翻转的行号(行号从 1 开始计)。
若有多种方案,输出任意一种即可。
输入
2 5
1 2 3 4 5
5 4 3 2 1
输出
No
说明
将第 2 行翻转后,变为
1 2 3 4 5
1 2 3 4 5
因此无法打开。
输入
3 4
1 2 3 4
5 2 3 8
1 7 4 2
输出
Yes
2
2 3
说明
将第 2 行翻转后,变为
1 2 3 4
8 3 2 5
1 7 4 2
将第 3 行翻转后,变为
1 2 3 4
8 3 2 5
2 4 7 1