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

Algorithm 给定一个整数数组(大小为N)和一个数字M,求该数组的N-1个元素的乘积模M,algorithm,Algorithm,假设您得到一个由N整数组成的数组A,另一个整数M。对于任何给定的指数i,其中0,对于这个答案,我假设这不是一次计算,但它可以使用不同的i值多次发生 首先,定义一个非易失性数组来保存计算的产品 然后,每当使用给定的一对参数(M和i)调用函数时: 如果产品是计算出来的,请在数组中进行检查 如果是,只需使用存储的值,计算MOD并返回结果 如果不是,则计算产品、存储产品、计算MOD并返回值 此方法避免了可能计算不需要的产品的(可能很长的)初始化。对于这个答案,我假设这不是一次性计算,但它可以使用不同的I

假设您得到一个由
N
整数组成的数组
A
,另一个整数
M
。对于任何给定的指数
i
,其中
0,对于这个答案,我假设这不是一次计算,但它可以使用不同的
i
值多次发生

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

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

  • 如果产品是计算出来的,请在数组中进行检查

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

  • 如果不是,则计算产品、存储产品、计算MOD并返回值


  • 此方法避免了可能计算不需要的产品的(可能很长的)初始化。

    对于这个答案,我假设这不是一次性计算,但它可以使用不同的
    I
    值多次发生

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

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

  • 如果产品是计算出来的,请在数组中进行检查

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

  • 如果不是,则计算产品、存储产品、计算MOD并返回值

  • 此方法避免了可能计算不需要的产品的(可能很长的)初始化。

    简单…:)

    现在查询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
    

    简单…:)

    现在查询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
    



    如果我们可能会问,你为什么要这样做?检查我的答案..它works@TimBIegeleisen:我在一次编码面试中被问到这个问题,当时我使用了基本的方法,但很多测试用例都超时了。所以我仍然想知道什么是做这件事的最佳方法。如果我们可能会问,为什么你需要这样做?检查我的答案..它works@TimBIegeleisen:我在一次编码面试中被问到这个问题,当时我使用了基本的方法,但很多测试用例都超时了。所以我仍然在想什么是实现这一点的最佳方法。请您在这里解释一下这种方法,以便更好地理解代码。@PraveshJain:当然。让我修改一下答案。很好的方法@FDavidov也提出了一种略为类似的方法。在您正在创建的两个数组中,我认为最好在取模后存储值。这样可以避免溢出。回答得好!您可以通过定义
    left[k]=乘积(a[i]表示i=0..k-1)(mod M)
    right[k]=乘积(a[i]表示i=k+1…n)(mod M)
    。它使两个阵列都变大1。那么你就不需要任何特殊情况了,
    query(k)=(left[k]*right[k])%M
    @PaulHankin.:我会很快编辑它并ping你..谢谢你的建议。为了更好地理解代码,请你在这里解释一下方法。@PraveshJain:当然..让我修改答案。方法很好@FDavidov也提出了一种略为类似的方法。在您正在创建的两个数组中,我认为最好在取模后存储值。这样可以避免溢出。回答得好!您可以通过定义
    left[k]=乘积(a[i]表示i=0..k-1)(mod M)
    right[k]=乘积(a[i]表示i=k+1…n)(mod M)
    。它使两个阵列都变大1。那么你就不需要任何特殊情况了,
    query(k)=(left[k]*right[k])%M
    @PaulHankin.:我会很快编辑它并ping你..谢谢你的建议。谢谢你。这当然是一种优化。如果我不能很快找到更优化的解决方案,我会接受的。谢谢。这当然是一种优化。如果我不能很快找到任何更优化的解决方案,我会接受这一点。