Arrays 除以数组中整数的乘法数,取模

Arrays 除以数组中整数的乘法数,取模,arrays,math,modulo,Arrays,Math,Modulo,我来问这个问题,就像下面的问题一样 你有一个由n个整数组成的数组(整数可以大到10^9),你有q个查询,每个查询都有一个数组的索引,因此你必须将数组乘以该特定索引的整数,然后你有一个数字,m,然后,你必须取这个数字m的模(可以高达10^9)并给出每个查询的结果 e.g. suppose you have an array of n = 5 integers 1,2,3,4,5 and you have q = 3 queries 1,3, 5 and mod value

我来问这个问题,就像下面的问题一样

你有一个由n个整数组成的数组(整数可以大到10^9),你有q个查询,每个查询都有一个数组的索引,因此你必须将数组乘以该特定索引的整数,然后你有一个数字,m,然后,你必须取这个数字m的模(可以高达10^9)并给出每个查询的结果

e.g. suppose you have an array of n = 5 integers
            1,2,3,4,5
and you have q = 3 queries 1,3, 5 and mod value m = 100.
for 1st query: (2*3*4*5) mod 100 = 20
for 2nd query: (1*2*4*5) mod 100 = 40
for 3rd query: (1*2*3*4) mod 100 = 24
so output is 20,40,24

我不需要代码,只要告诉我应该是最优的方法。

计算数组中所有整数的乘积。把它储存起来

int product = 1*2*3*4*5;
现在,对于每个查询,您的计算都很简单

(product/query) %100; 

计算数组中所有整数的乘积。把它储存起来

int product = 1*2*3*4*5;
现在,对于每个查询,您的计算都很简单

(product/query) %100; 

我可以想出一个解决方案,它涉及到对相对较小的数递归使用模运算符。此解决方案可能需要很长时间进行计算,但它应该能够轻松避免您遇到的溢出类型

我们可以利用模运算的以下特性:

(a*b) mod c = ((a mod c)*b) mod c
下面是一个简单的例子。它使用相对较小的数字(远小于您将经历的溢出),但它证明了这一点


按照“传统方式”计算,您只需执行以下操作:

120 mod 7 = 1
但是,假设我们不能使用120这样大的数字

我们可以这样做:

(5) mod 7 = 5   (take this result as input to next line)
            |
            |
 +----------+
 |
 |
(5*4) mod 7 = 20 mod 7 = 6 
                         |
                         |
 +-----------------------+
 |
 |
(6*3) mod 7 = 18 mod 7 = 4
                         |
                         |
 +-----------------------+
 |
 |
(4*2) mod 7 = 8 mod 7 = 1
                        |
                        |
 +----------------------+
 |
 |
(1*1) mod 7 = 1 mod 7 = 1  <--this is final result

通过这样做,您将只处理
(a mod c)*(b mod c)
(必须小于或等于
(c-1)^2
(因为
x mod c
必须小于或等于
c-1
)的大数,而不是处理
a*b
。当然,处理更小数字的折衷办法是,代码会更复杂,执行时间也会稍长。

我可以想出一个解决方案,它涉及对相对较小的数字递归使用模运算符。此解决方案可能需要很长时间进行计算,但它应该能够轻松避免您遇到的溢出类型

我们可以利用模运算的以下特性:

(a*b) mod c = ((a mod c)*b) mod c
下面是一个简单的例子。它使用相对较小的数字(远小于您将经历的溢出),但它证明了这一点


按照“传统方式”计算,您只需执行以下操作:

120 mod 7 = 1
但是,假设我们不能使用120这样大的数字

我们可以这样做:

(5) mod 7 = 5   (take this result as input to next line)
            |
            |
 +----------+
 |
 |
(5*4) mod 7 = 20 mod 7 = 6 
                         |
                         |
 +-----------------------+
 |
 |
(6*3) mod 7 = 18 mod 7 = 4
                         |
                         |
 +-----------------------+
 |
 |
(4*2) mod 7 = 8 mod 7 = 1
                        |
                        |
 +----------------------+
 |
 |
(1*1) mod 7 = 1 mod 7 = 1  <--this is final result

通过这样做,您将只处理
(a mod c)*(b mod c)
(必须小于或等于
(c-1)^2
(因为
x mod c
必须小于或等于
c-1
)的大数,而不是处理
a*b
。当然,处理更小的数字的代价是代码会更复杂,执行时间会稍长。

产品可能会很快变大。简单的整数数据类型是不够的,大整数的速度会非常慢。我说过整数可以大到10^9,所以所有这些整数的乘积都会导致溢出,所以这不是一个好的解决方案。乘积可以非常快地变大。简单的整数数据类型是不够的,大整数的速度会非常慢。我说过整数可以大到10^9,所以所有这些整数的乘积都会导致溢出,所以这不是一个好的解决方案。在实际问题中,是m素数吗?您的问题的答案取决于m和列表中整数之间的关系。我是素数吗?m相对于列表中的所有数字都是素数吗?如果其中一个是这样的话,就有一个快速而简单的算法。如果不知道或者你不知道,最好的算法速度较慢,但仍然可行。不,m不是素数。在实际问题中,m是素数吗?你问题的答案取决于m和列表中整数之间的关系。我是素数吗?m相对于列表中的所有数字都是素数吗?如果其中一个是这样的话,就有一个快速而简单的算法。如果不知道或者你不知道,最好的算法速度较慢,但仍然可行。不,m不是prime,我不确定是否还有其他选择。我唯一能想到的加速计算时间(但增加内存使用)的方法是让你的程序利用数据库(甚至只是一个文本文件)存储模数运算解决方案的查找表的。因此,与您的程序每次都需要计算模数不同,它只是在文本文件中查找值。我不确定是否还有其他选项。我唯一能想到的可能加快计算时间(但增加内存使用)的另一件事是让您的程序利用数据库(甚至只是一个文本文件)存储模数运算解决方案的查找表的。因此,您的程序不需要每次都计算模数,它只需在文本文件中查找值。