ブルーブリッジカップのテスト質問前のテスト質問k回間隔(Javaソリューション)

ブルーブリッジカップのテスト質問前のテスト質問k回間隔(Javaソリューション)

この質問上司のブログ投稿から引用されています、上司を崇拝してください!

トピック

長さ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();
	}
}

おすすめ

転載: blog.csdn.net/L333333333/article/details/105079630