假设您获得了A
个N
整数和另一个整数M
的数组i
。对于0 <= i < N
的任何给定索引ith
,隐藏A
的{{1}}索引并返回A模M的所有其他元素的乘积。
例如,对A = {1, 2, 3, 4, 5}
说M=100
和i=1
,结果为(1x3x4x5) mod 100
。因此结果是60。
假设所有整数都是32位无符号整数。
现在一个明显的方法是计算任何给定值i
的结果。对于N-1
的每个给定值,这意味着i
次乘法。有更好的方法吗?
P.S。
第一个想法是将所有数字的乘积存储在A
中(让我们称之为total
)。现在,对于i
的每个给定值,我们可以将total
除以A[i]
并在获取模数后返回结果。但是,total
会导致溢出,因此无法完成。
答案 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
值进行多次。
首先,定义一个非易失性数组来保存计算产品。
然后,每当使用给定的参数对(M
和i
)调用函数时:
检查数组(上图)是否计算了产品,
如果是,只需使用存储的值,计算MOD并返回结果,
如果没有,请计算产品,存储,计算MOD并返回值。
此方法使您免于进行(可能很长)初始化,这可能会计算出不需要的产品。