n
整数の配列a0, a1, .. an
と正の整数が与えられk
ます。(i,j)
とが( は) でi+j
割り切れるペアの数を見つけて出力します。この問題はhereから取得されました。k
i+j % k == 0
時間内に解決策が必要O(n)
です。
説明は、mod k に応じて要素をバケットに分けることでこれを行うことができるということです。たとえば、次の要素があります。1 3 2 6 4 5 9 and k = 3
mod 3 == 0 : 3 6 9
mod 3 == 1 : 1 4
mod 3 == 2 : 2 5
すると、次のように言われます。
これで、次のようにペアを作成できます: mod 3 == 0 の要素は (3 - 0) mod k = 0 の要素と一致するため、mod 3 == 0 リスト内の他の要素は次のようになります: (3, 6 ) (3, 9) (6, 9)
さらに遠く:
このようなペアは n * (n - 1) / 2 個あります。ここで、n はリストの長さです。これは、リストが同じであり、i != j であるためです。mod 3 == 1 の要素は (3 - 1) mod k = 2 の要素と一致するため、mod 3 == 2 リストの要素は次のようになります: (1, 2) (1, 5) (4, 2) ) (4, 5)
(3, 6) (3, 9) (6, 9) ( all items in the 0th bucket be paired)
それ以来、それは理にかなってい(a + b)% k = 0 = a % k + b % k
ます。
明確でないのは、1 番目 (mod 3 == 1) および 2 番目 (mod 3 == 2) バケットの要素の組み合わせによって他のペアがどのように生成されたか、および n * (n - 1) / 2 ペアが存在する理由です。 . 別の(より良い)方法はありますか?
この質問は、質問を投稿する前に存在を知らなかった Math Stackexchange に適しています。