5068.地牢谜题:三个怪人

时间限制:16s 内存限制:512MB

好的,现在你身处一个房间内。在你的面前有 $3$ 个宝箱以及 $3$ 个怪人。其中只有一个宝箱是真的宝箱,其他都是假的,你必须一次打开真宝箱。房间里的每个怪人会告诉你以下两种消息之一,但不一定是实话:

  • 有 k (1≤k≤3)$ 个怪人会说实话。

  • 真宝箱是第 $i (1≤i≤3)$ 个宝箱。

这似乎是地牢谜题中最困难的问题之一,因为玩家总是要花时间去考虑究竟谁在说实话。但更为困难的是,作为谜题的设计者,如何设计出合法的谜题。

现在假设有 $n$ 个不同的宝箱以及 $m$ 个相同的怪人,询问有多少种本质不同的合法谜题。一个谜题合法,当且仅当只有一个真宝箱作为前提条件时,玩家能够通过怪人们的话唯一确定真的宝箱。两个谜题本质不同,当且仅当满足下面两个条件之一:

  • 存在 $1≤k≤m$,说"有 $k$ 个怪人会说实话"的怪人数量不同。

  • 存在 $1≤i≤n$,说"真宝箱是第 $i$ 个宝箱"的怪人数量不同。

由于答案可能很大,请输出其对某质数$P$ 取模的结果。

输入格式(从终端/标准输入读取)

输入第一行包含一个整数 $T ($1≤T≤10)$,表示该组数据的测试点组数。

对于每组测试点,

输入第一行包含三个整数 $n, m, P (1≤n,m≤200, 10^8 ≤P \lt 10^9 )$,表示宝箱的数量,怪人的数量,以及取模的质数。

输出格式(输出至终端/标准输出)

对于每组测试点,输出一行一个整数,表示合法谜题的数量对 $P$ 取模的结果。

输入样例

复制
3
2 3 998244353
200 1 998244353
2 1 998244353
 \n
 · ·         \n
   · ·         \n
 · ·         \n

输出样例

复制
6
200
0
 \n
   \n
 \n

说明

对于第一组测试点,合法的谜题有:

  • 1 个人说第一个宝箱是真的,2 个人说有一个人说实话。这样能够确定第二个宝箱是真的。
  • 2 个人说第一个宝箱是真的,1 个人说有两个人说实话。这样能够确定第二个宝箱是真的。
  • 1 个人说第一个宝箱是真的,1 个人说有一个人说实话,1 个人说有三个人说实话。这样能够确定第二个宝箱是真的。
  • 1个人说第二个宝箱是真的,2 个人说有一个人说实话。这样能够确定第一个宝箱是真的。
  • 2个人说第二个宝箱是真的,1 个人说有两个人说实话。这样能够确定第一个宝箱是真的。
  • 1个人说第二个宝箱是真的,1 个人说有一个人说实话,1 个人说有三个人说实话。这样能够确定第一个宝箱是真的。

对于第二组测试点,唯一的人一旦指定了真宝箱,那么就可以确定那就是真的宝箱。

对于第三组测试点,即使唯一的人指定了真宝箱,由于存在他在说谎且真宝箱为另一个宝箱的情况,所以不存在合法的谜题。

来源: 2024“钉耙编程”中国大学生算法设计超级联赛(9)

提交题解

Please login first.

© 2025 FAQs