#P0402. 橡皮筋与钉子

橡皮筋与钉子

题目描述

汪老师有 n+1n+1 个钉子,它将它们钉在一个平面上。

其中有 nn 个红色的钉子,以这 nn 个钉子作为顶点能够形成一个正 nn 边形。这 nn 个钉子按逆时针从 11 编号到 nn

还有一个蓝色的钉子,这个钉子比其它钉子的直径要稍微小一点点,它坐落在正 nn 边形的中心。

初始的时候还有一根橡皮筋,它缠绕在红色的钉子外面。

汪老师今天非常无聊所以他准备玩一个游戏。初始时,他有一个空的数列 aa。只要橡皮筋没有碰到蓝色的钉子,它就会一直执行如下操作:

  1. 选择编号为 i(1in)i(1 \le i \le n) 的红色钉子 —— 要求是这个钉子目前没有被移除;
  2. 移除掉编号为 ii 的红色钉子;
  3. ii 添加到数列 aa 的末尾。

汪老师想要知道最终的数列 aa(即:进行最后一次操作后橡皮筋碰到蓝色钉子对应的数列 aa)有多少种不同的可能。

由于方案数可能很多,所以你只需要输出总的方案数模 pp 的结果即可。

上图演示了 n=9n=9a=[7,5,2,8,3,9,4]a=[7,5,2,8,3,9,4] 以及 n=8n = 8a=[3,4,7,1,8,5,2]a=[3,4,7,1,8,5,2] 时的两个例子。

注:如果你是pdf文件,或者没有看到上方的动画,你可以点击 此链接 查看上方动画

输入格式

一行,两个整数 nnpp3n5000,108p1093 \le n \le 5000, 10^8 \le p \le 10^9)——分别表示红色钉子的数量以及要模的那个数字。

数据保证 pp 是一个素数。

输出格式

输出一个整数,表示最终得到的不同数列 aa 的数量模 pp 的结果。

样例输入1

4 100000007

样例输出1

16

样例输入2

1145 141919831

样例输出2

105242108

说明/提示

样例 1 解释

样例1中,最终的排列 aa 一共有 1616 种情况,它们分别是:

  • 1,21,2
  • 1,3,21,3,2
  • 1,3,41,3,4
  • 1,41,4
  • 2,12,1
  • 2,32,3
  • 2,4,12,4,1
  • 2,4,32,4,3
  • 3,1,23,1,2
  • 3,1,43,1,4
  • 3,23,2
  • 3,43,4
  • 4,14,1
  • 4,2,14,2,1
  • 4,2,34,2,3
  • 4,34,3

数据规模与约定

  • 对于 30%30\% 的数据,n10n \le 10
  • 对于 60%60\% 的数据,n500n \le 500
  • 对于 100%100\% 的数据,3n5000,108p1093 \le n \le 5000, 10^8 \le p \le 10^9