前綴和問題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); } }