3 回答
TA贡献1848条经验 获得超10个赞
这些大量模量任务的关键是在执行模量之前不计算全部结果。您应该在中间步骤中减小模数以保持数量小:
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。之后,您可以安全地执行余数运算%(如果也为正数),并在需要时转换为整数。
TA贡献1799条经验 获得超6个赞
首先,观察一下这500!/20!
是21到500之间的所有数字的乘积,包括端点和下一个。接下来,观察您可以逐项执行模乘,%1000000007
并在每个运算的末尾进行。您现在应该可以编写程序了。注意不要使数字溢出:32位可能还不够。
TA贡献1775条经验 获得超11个赞
我认为这可能对您有用
for(mod=prime,res=1,i=20;i<501;i++)
{
res*=i; // an obvious step to be done
if(res>mod) // check if the number exceeds mod
res%=
添加回答
举报