#P1332. Finding Liars
Finding Liars
题目描述
有 个人,编号为 ,每个人要么是诚实者,要么是说谎者,且说谎者的数量不超过某个给定的 ()。
每个人 可以测试另一个人 ,通过提问来判断 是诚实者还是说谎者。测试结果 的值如下:
- 如果 认为 是说谎者,则 ;
- 如果 认为 是诚实者,则 。
测试结果 可靠,当且仅当测试者 是诚实者;否则, 不可靠(即 是说谎者时, 可能是 或 )。具体关系如下表:
测试过程是环形进行的:
- 人 测试人 ;
- 人 测试人 ;
- 人 测试人 ;
- 人 测试人 。
根据测试结果,可以确定某些人一定是说谎者,而其他人可能无法确定。给定 (人数)、(最多说谎者数量)和测试结果,编写程序找出所有一定是说谎者的人。
示例
设 ,,测试结果 $(a_{1,2}, a_{2,3}, a_{3,4}, a_{4,5}, a_{5,1}) = (0, 1, 1, 0, 0)$。此时:
- 如果人 是诚实者,则人 和人 必须是说谎者,进而导致人 和人 也必须是说谎者,但这样总说谎者数量超过 ,矛盾。因此,人 一定是说谎者。
- 但人 可能是说谎者,也可能不是,因此不能确定。
任务
给定 、 和测试结果,找出所有一定是说谎者的人。题目保证输入的测试结果至少对应一种说谎者数量不超过 的情况。
输入
输入包含 个测试用例。第一行给出测试用例数量 。每个测试用例包含两行:
- 第一行:(人数,)和 (最多说谎者数量,);
- 第二行: 个 或 ,表示测试结果 。
输出
每个测试用例输出一行,包含两个整数:
- 一定是说谎者的人数;
- 这些说谎者中最小的编号。
如果没有一定是说谎者的人,则输出 。
输入样例
3
5 2
0 1 1 0 0
7 2
0 0 1 0 0 1 1
9 8
1 0 0 0 0 1 0 0 0
输出样例
1 3
2 4
0 0
题目来源
Taejon 2002