给定整数数组(大小为N)和数字M,找到模数为M的数组的N-1个元素的乘积

时间:2016-12-29 08:58:35

标签: algorithm

假设您获得了AN整数和另一个整数M的数组i。对于0 <= i < N的任何给定索引ith,隐藏A的{​​{1}}索引并返回A模M的所有其他元素的乘积。

例如,对A = {1, 2, 3, 4, 5}M=100i=1,结果为(1x3x4x5) mod 100。因此结果是60。

假设所有整数都是32位无符号整数。

现在一个明显的方法是计算任何给定值i的结果。对于N-1的每个给定值,这意味着i次乘法。有更好的方法吗?

P.S。 第一个想法是将所有数字的乘积存储在A中(让我们称之为total)。现在,对于i的每个给定值,我们可以将total除以A[i]并在获取模数后返回结果。但是,total会导致溢出,因此无法完成。

2 个答案:

答案 0 :(得分:2)

...易:)

left[0]=a[0];
for(int i=1;i<=n-1;i++)
    left[i]=(left[i-1]*a[i])%M;

right[n-1]=a[n-1];
for(int i=n-2;i>=0;i--)
    right[i]=(right[i-1]*a[i])%M;


for query q
    if(q==0)
        return right[1]%M;
    if(q==n-1)
        return left[n-2]%M;
    return (left[q-1]*right[q+1])%M;

假设有一个包含5个元素的数组。 现在

index:   1  2  3  4  5
         1  5  2  10 4

现在查询q = 3

answer is = ((1*5) * (10*4))%M

查询q = 4

answer is = ((1*5*2)*(4))%M

我们基本上预先计算所有左右乘法

index:   1      2      3    4    5
         1      5      2    10   4
 left:   1      5      10   100  400
right:   400    400    80   40   4
For q=3 answer is left[2]*right[4]= (5*40)%M= 200%M
For q=4 answer is left[3]*right[5]= (10*4)%M= 40%M

答案 1 :(得分:0)

对于这个答案,我假设这不是一次性计算,但它可以使用不同的i值进行多次。

首先,定义一个非易失性数组来保存计算产品。

然后,每当使用给定的参数对(Mi)调用函数时:

  1. 检查数组(上图)是否计算了产品,

  2. 如果是,只需使用存储的值,计算MOD并返回结果,

  3. 如果没有,请计算产品,存储,计算MOD并返回值。

  4. 此方法使您免于进行(可能很长)初始化,这可能会计算出不需要的产品。