Algorithm 用大数求大数的模

Algorithm 用大数求大数的模,algorithm,math,Algorithm,Math,我有一个数字n和m。它们都非常大,超过了C++长的限制。如何准确地找到n mod m Naive n%m最多只能起到2^63-1的效果,在在线评委中得到9分 一次添加一位n并使用%m适用于小m,但速度非常慢,并且对于m=1的特殊情况,没有硬编码,它超过了这样小m的时间限制。在线评委会得到37分 那么,有没有一种计算n mod m的方法,将它们作为字符串给定 问题:假设m被限制为小于10!也就是3628800,你可以用一种简单的方法一次处理一个数字 如果n的数字是d[i],其中i从0到n-1,d[

我有一个数字n和m。它们都非常大,超过了C++长的限制。如何准确地找到n mod m

Naive n%m最多只能起到2^63-1的效果,在在线评委中得到9分

一次添加一位n并使用%m适用于小m,但速度非常慢,并且对于m=1的特殊情况,没有硬编码,它超过了这样小m的时间限制。在线评委会得到37分

那么,有没有一种计算n mod m的方法,将它们作为字符串给定

问题:

假设m被限制为小于10!也就是3628800,你可以用一种简单的方法一次处理一个数字

如果n的数字是d[i],其中i从0到n-1,d[0]是最有效的数字,那么类似这样的代码可以工作:

R = 0
for i = 0 to N-1
    R = (10 * R + d[i]) % m
return R

处理这个问题的一种方法是二进制方法。算法步骤如下所示:

设置a=n,在m>a的情况下尽可能向左移动a m=m-a 如果m
我还没有实现它,但是所有的操作都是基本的二进制操作,避免了相对昂贵的模运算,算法的复杂性在其中N是位数;因此,它的性能应该很好。

您还没有包括问题的所有细节。正如您所写的,答案是使用bignum库。但问题的约束部分给出了m表示为1到10之间的数字的乘积,并且小于10!。这种限制使问题更容易自己编写。