找到大数的模数

时间:2018-06-14 07:56:21

标签: algorithm math

我有一个号码nm。它们都非常大并且超出了C ++ long long的限制。如何准确找到n mod m

朴素的n % m最多只能2^63-1,并且会在9获得在线评判。

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

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

问题:https://dunjudge.me/analysis/problems/669/

2 个答案:

答案 0 :(得分:1)

鉴于m被限制为小于10! (即3628800)您可以轻松地一次处理n个数字。

如果n的数字是d[i],其中i从0变为N-1d[0]是最重要的数字),那么像这工作(伪代码):

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

答案 1 :(得分:0)

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

  1. 尽可能将a = n班次a设置为左m > a
  2. m = m - a
  3. 如果m < n DONE结果为m,则转到步骤1
  4. 首先,由于您在字符串中同时包含两个数字,因此从1m左侧查找左侧第一个n的索引并获取它们的差异将得到必要的数字轮班。

    我还没有实现它,但是所有操作都是基本的二进制操作(避免相对昂贵的模数),算法的复杂度是O(N),其中N是数字位数;所以它应该有一个不错的表现。