我遇到了一个需要计算类似问题的问题:
((500!)/(20!x20!x20!x20!...))mod 1000000007
我理解如何计算500!%1000000007,但我不确定如何在分区中分配该运算符。
我目前正在尝试编写一个代码,通过分子的因子来取消分母。但我不确定这是否是一个很好的方法。
我只需要一种解决这类问题的数学方法(mod1000000007),因为它们经常在编程比赛中遇到,并会帮助我准备Google Code Jam。
答案 0 :(得分:4)
方法1:
考虑一下如何正常计算500! / (20! * 20! * 20! * ...)
。
不要把所有东西都加倍,最后分开。你的分歧在中间。然后将其与前一个问题的模数减少结合起来。
方法2:
Prime factorize 500!
和20!
。然后从20! * 20! * 20!
的素因子中减去500!
(或者你有多少)的素因子。
然后通过将剩余因子相乘来重建数字。 (同时沿着模数采取模数以防止数量变大)
方法3:
如果1000000007
(或任何模数)为素数,则可以使用modular inverse进行除法。
计算20! mod 1000000007
。然后计算它的模逆,并将其乘以500! mod 1000000007
。