S42103.21-3 破译密档

传统题 时间 1000 ms 内存 256 MiB 3 尝试 0 已通过 0

21-3 破译密档

破译密档

交换计数完了,但Echo-0留下了一份密档——加密的文档,需要破译。

"密档?"CC问。

"对。"Echo说,"Echo-0用组合数学加密了这份文档。要破译,必须解开组合数的秘密。"

"组合数?"

"对。"你说,"C(n,m)C(n,m)——从nn个里面选mm个的方案数。"

"咋算?"

"递推。"你说,"C(n,m)=C(n1,m)+C(n1,m1)C(n,m)=C(n-1,m)+C(n-1,m-1)。"

"或者?"

"阶乘。"你说,"C(n,m)=n!/(m!(nm)!)C(n,m)=n!/(m!(n-m)!)。"

"模运算呢?"

"对。"你说,"模大质数,用逆元——$C(n,m)\equiv n!\times(m!)^{-1}\times((n-m)!)^{-1}\pmod{p}$。"

"Lucas定理?"

"对。"你说,"如果pp比较小,把nnmm拆成pp进制,然后每一位分别算组合数,再乘起来。"

"第47个密档。"你说,"n=47n=47m=23m=23——C(47,23)C(47,23)109+710^9+7。"

"多大?"

"很大。"你说,"但Lucas定理或预处理阶乘,瞬间算完。"

"答案?"

"不是重点。"你说,"重点是过程——怎么从nnmm得到答案。"

"像开锁。"

"对。"你说,"像开锁——知道结构,就能打开。"

CC把密档捧在手里——不是真的捧,是看着屏幕上的加密文本。

"字好多。"她说。

"对。"你说,"但每个字都有位置——组合数决定了它的位置。"

"位置对了,就懂了。"

"对。"你说,"位置对了,就懂了。"

Echo把破译结果投射出来——是一封信,Echo-0写给未来的信。

"信里写了啥?"CC问。

"写了……"Echo停顿了一下,"写了对不起。"

"对不起谁?"

"对不起我。"Echo说,"对不起她自己。"


题目描述

给定n,m,pn,m,p,求C(n,m)modpC(n,m)\bmod ppp为质数。

输入格式

一行三个整数n,m,pn,m,p

输出格式

C(n,m)modpC(n,m)\bmod p


输入样例

5

输出样例

0

提示

  • Lucas定理:C(n,m)C(ni,mi)(modp)C(n,m)\equiv\prod C(n_i,m_i)\pmod{p},其中ni,min_i,m_ipp进制位。
  • 预处理11p1p-1的阶乘和逆元。

在线编程 IDE

建议全屏模式获得最佳体验