トピック
長さN、A1、A2、…ANのシーケンスが与えられ、連続したサブシーケンスAi、Ai + 1、…Aj(i <= j)の合計がKの倍数である場合、この間隔を[ i、j]はK回の間隔です。
シーケンス内のK倍間隔の総数を見つけることができますか?
入る
最初の行には、2つの整数NとKが含まれています。(1 <= N、K <= 100000)
次のN行のそれぞれに整数Aiが含まれています。(1 <= Ai <= 100000)
出力
K回の間隔の数を表す整数を出力します。
アイデア
読み込みて処理します。
jの前のすべての数値の合計(jを含む)がsum [j]であると仮定します
。K回の間隔は(sum [j] -sum [i-1])%k = 0を満たすため、
変形したsum [j]%k = sum [i-1]%k;
つまり、現在の位置が合計%kに等しくなるまでの
時間を調べるだけです。ループ内で毎回合計%kを計算し、残りの残りの数が同じであるかどうかを調べて、それらを合計します。また、1つのケース、つまりsum%k = 0のケースもありません。これは、0からここまでのK回の間隔を形成する可能性があります。
kの残りが取得されるため、残りはkを超えることはなく、k個のスペースストレージに適用するだけで済みます。
このアルゴリズムの時間の複雑さはo(n)です。
コード
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n,k,sum = 0;
long count = 0;
n = sc.nextInt();
k = sc.nextInt();
int[] cnt = new int[k];
for (int i = 0; i < n; i++) {
sum = (sum + sc.nextInt()) % k;
count += cnt[sum]++;
}
count += cnt[0];
System.out.println(count);
sc.close();
}
}