2017-10-17 1 views
1

剰余を取ると、(整数は10^9と同じ大きさにすることができます)あなたはq個のクエリを持っています。すべてのクエリは配列のインデックスを1つ持っていますので、その特定のインデックスの整数を除いて配列を掛けなければなりません。そして、1つの数mを持ちます。 10^9まで)、各クエリの結果を返す。除算私はあなたがn個の整数の配列を持っている <p></p>を、以下のようなもので、この質問に来た

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 

私はコードがちょうど最適であるべきアプローチを教えたくありません。

+1

実際の問題はmプライムですか? – dmuir

+0

あなたの質問に対する答えは、mとリスト内の整数の関係によって決まります。 mプライムですか? mはリストのすべての数字に比例していますか?いずれかがそうであれば、高速で簡単なアルゴリズムがあります。そうでない場合や、わからない場合は、最適なアルゴリズムは遅くても実行可能です。 –

+0

いいえ、mは素数ではありません –

答えて

0

配列内のすべてのintの積を計算します。それを保管してください。

int product = 1*2*3*4*5; 

は今クエリごとに、あなたの計算は単純

(product/query) %100; 
+0

非常に速くなりうる製品です。単純な整数データ型では十分ではなく、BigIntegerはかなり遅くなります。 –

+0

私は整数が10^9の大きさであると言ったので、これらの整数のすべての積がオーバーフローにつながるので、これは良い解決策ではありません。 –

0

である私は、再帰的に比較的少数の剰余演算子を使用することを含む一つの解決策を考えることができます。このソリューションは、計算に時間がかかることがありますが、発生しているオーバーフローの種類を簡単に回避できる必要があります。

我々は、モジュラ算術の次のプロパティを利用することができます。

(a*b) mod c = ((a mod c)*b) mod c 

簡単な例は、以下を参照してください。これは、比較的小さな数値(経験するオーバーフローよりもはるかに小さい)を使用しますが、その点を実証しています。


(5*4*3*2*1) mod 7 

計算この「伝統的な方法」あなたがやるだけでしょう:

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 

上記の結果(1)は、120 mod 7という計算を直接行うことと同じ結果になります。しかし、どの計算でも最大の数字は20でした。

もう1つ注意すべき点:この方法の場合、中間結果が0である場合、最終結果は0でなければなりません。


EDIT

あなたも小さい数字に対処する必要がある場合は、剰余演算の次のプロパティを使用することができます(実際には、既に上記示されているものの単なる延長である):

a*b mod c = ((a mod c)*(b mod c)) mod c 

これを行うのではなく、a*bとして大きなとして数字を扱うことで、あなただけ以下でなければなりません、(a mod c)*(b mod c)として大きなとして数字を扱います(x mod cc-1以下である必要があります)。もちろん、より小さい数値を扱う場合のトレードオフは、コードがより複雑になり、実行に少し時間がかかることです。

+0

私は同じ方法を使用しましたが、多くのテストケースでTLEを取得しました –

+0

他のオプションがあるかどうかはわかりません。 – ImaginaryHuman072889

+0

計算時間を短縮する(しかしメモリ使用量を増やす)可能性があると考えられる唯一のもう一つの点は、モジュラス演算の解のルックアップテーブルを格納するデータベース(またはテキストファイル)をプログラムが利用することです。したがって、毎回モジュラスを計算する必要のあるプログラムではなく、テキストファイルの値を調べるだけです。 – ImaginaryHuman072889

関連する問題