【发布时间】:2022-01-17 02:51:57
【问题描述】:
如何计算a!/(b1! b2! ... bm!) modulo p,其中p 是质数? a 和 b 的阶乘可能很大(long long int 不够),所以我需要传递模数。
【问题讨论】:
-
有条件使其成为整数。显然,a>= max(b1,b2,...bm)。您是否有更多详细信息 - 例如如果 b1+b2...bm=a 那么您确定它是一个整数,因为它是混合 m 个大小为 bi 的组而不在组内排列的方式数。
-
@user3386109 因为 p 是素数,您可以通过计算模逆来执行除法。我会将其扩展为答案。
-
Removing common factors leaves a multiplication。然后可以通过注意
(a * b) mod p = ((a mod p) * (b mod p)) mod p来执行乘法。 -
要去除公因子,您还可以获得
a!、b1!、b2!等的素数分解,然后将a!的素数的指数减去每个b_i!的素数。 -
我会采用之前的建议来存储素因子。您有大约 19 个低于 60 的素因数。您将有一个 2D 数组存储 1..60 的那些,您可以使用正确的值对其进行初始化(通过外部计算并粘贴到代码中或使用
constexpr函数,它确实计算正常,但在编译时执行)。第二个一维数组存储素数。一旦你知道分数结果的主要因素,它就是一个简单的循环乘法,并且不时做模(%)。
标签: c++ algorithm modulo factorial number-theory