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(n−1,m)+C(n−1,m−1)C(n,m)=C(n-1,m)+C(n-1,m-1)。"

"或者?"

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

"模运算呢?"

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

"Lucas定理?"

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

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

"多大?"

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

"答案?"

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

"像开锁。"

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

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

"字好多。"她说。

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

"位置对了,就懂了。"

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

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

"信里写了啥?"CC问。

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

"对不起谁?"

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


题目描述

给定n,m,pn,m,p,求C(n,m) mod pC(n,m)\bmod p。pp为质数。

输入格式

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

输出格式

C(n,m) mod pC(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_i是pp进制位。
  • 预处理11到p−1p-1的阶乘和逆元。

在线编程 IDE

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