前綴和

前綴和問題java

 k倍區間spa

給定一個長度爲N的數列,A1, A2, … AN,若是其中一段連續的子序列Ai, Ai+1, … Aj(i <= j)之和是K的倍數,咱們就稱這個區間[i, j]是K倍區間。code

你能求出數列中總共有多少個K倍區間嗎?blog

統計前綴和
sum[1] = a1;
sum[2] = a1+a2;
sum[i] = a1+a2+…+ai;
對於任意一段區間[l,r]的和就是sum[r]-sum[l-1].
(sum[r]-sum[l-1])%k 保證了[l,r]這段區間要麼%k等於0 要麼比k小 等於0這表示了正好是k的倍數 而後經過前綴和相同的數據來判斷出剩下的k的倍數:(sum[r]-sum[l-1])%k == 0.變形後就是:sum[r]%k==sum[l-1]%k .
 例如:class

統計前綴和
sum[1] = a1;
sum[2] = a1+a2;
sum[i] = a1+a2+…+ai;
對於任意一段區間[l,r]的和就是sum[r]-sum[l-1].
(sum[r]-sum[l-1])%k 保證了[l,r]這段區間要麼%k等於0 要麼比k小 等於0這表示了正好是k的倍數 而後經過前綴和相同的數據來判斷出剩下的k的倍數:(sum[r]-sum[l-1])%k == 0.變形後就是:sum[r]%k==sum[l-1]%k .import

當i = 0, sum=0,bk[1]=1;
當i = 1, sum=1,bk[1]=2; //由於當bk[1]以前爲1時 可得相減=0爲k的倍數
當i = 2, sum=1,bk[0]=1;
當i = 3, sum=2,bk[0]=2; //同上理,當0-0時仍是0
當i = 4, sum=4,bk[1]=3; //以前bk[1]有2個 因此有2種-法 因此sum加上2
最後統計bk[0]有幾個 sum+=bk[0] //由於以前只考慮了相減的狀況 沒有考慮到自己
sum = 6;im

import java.util.*;

public class Main8 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt();
        int sum = 0;
        int a[] = new int[10010];
        int b[] = new int[10010];
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
        }
        a[0] = a[0] % k;
        for (int i = 1; i < n; i++) {
            a[i] = (a[i] + a[i - 1]) % k;
        }
        for (int i = 0; i < n; i++) {
            sum += b[a[i]]++;
        }
        sum += b[0];
        System.out.println(sum);
    }

}
相關文章
相關標籤/搜索