小编典典

在mod 1000000007问题中需要帮助

algorithm

我的数学能力很弱,总是陷入那些需要以模素数为模的答案的问题。

例如:(500!/ 20!)mod 1000000007

我对BigIntegers很熟悉,但是在计算500的阶乘(即使使用DP之后)之后计算模数似乎要花费大量时间。

我想知道是否存在解决此类问题的特殊方法。

这是我目前正在尝试解决的一个此类问题:http :
//www.codechef.com/FEB12/problems/WCOUNT

如果有人可以引导我学习解决这些编码问题的教程或方法,那将非常有帮助。我熟悉Java和C ++。


阅读 289

收藏
2020-07-28

共1个答案

小编典典

这些大量模量任务的关键是在执行模量之前不计算全部结果。 您应该在中间步骤中减小模数以保持数量小:

500! / 20! = 21 * 22 * 23 * ... * 500

21 * 22 * 23 * 24 * 25 * 26 * 27 = 4475671200

4475671200 mod 1000000007 = 475671172
475671172 * 28 mod 1000000007 = 318792725
318792725 * 29 mod 1000000007 = 244988962
244988962 * 30 mod 1000000007 = 349668811

...

 31768431 * 500 mod 1000000007 = 884215395

500! / 20! mod 1000000007 = 884215395

您无需在每一步都减少模量。只要经常做就足以防止数量过大。


请注意,的最大值long为2 ^ 63-1。因此,在两个正整数值(即操作数之一是a
long)之间执行64位乘法运算不会溢出long。之后,您可以安全地执行余数运算%(如果也为正数),并在需要时转换为整数。

2020-07-28