アルゴリズムに関する 1 つの質問に行き詰まりました。以下の問題に対する効率的なアルゴリズムを提案してください。
質問は
合計が指定された数で割り切れる部分配列の数を見つけます。
私の仕事
複雑さが O(N^2) の 1 つのアルゴリズムを作成しました。ここでは、N = 配列のサイズです。
マイコード
#include<stdio.h>
using namespace std;
main() {
int N;
int P;
int T;
int val;
long long int count = 0;
long long int answer = 0;
scanf("%d", &T);
//T = 20;
for(int k = 1; k <= T; k++) {
scanf("%d", &N);
scanf("%d", &P);
count = 0;
answer = 0;
for(int i = 0; i < N; i++) {
scanf("%d", &val);
count += val;
workingArray[i] = count;
}
for(int length = 1; length <= N; length++) {
for(int start = 0; start <= (N-length); start++) {
if( start == 0 ) {
if(workingArray[start+length-1]%P == 0) answer++;
}
else if( (workingArray[start+length-1] - workingArray[start-1])%P == 0) answer++;
}
}
printf("Case #%d\n%lld\n", k, answer);
}
return 0;
}