1. 程式人生 > 其它 >acwing-K倍區間

acwing-K倍區間

給定一個長度為 NN 的數列,A1,A2,ANA1,A2,…AN,如果其中一段連續的子序列 Ai,Ai+1,AjAi,Ai+1,…Aj 之和是 KK 的倍數,我們就稱這個區間 [i,j][i,j] 是 KK 倍區間。

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

輸入格式

第一行包含兩個整數 NN 和 KK。

以下 NN 行每行包含一個整數 AiAi。

輸出格式

輸出一個整數,代表 KK 倍區間的數目。

資料範圍

1N,K1000001≤N,K≤100000,
1Ai1000001≤Ai≤100000

輸入樣例:

5 2
1
2
3
4
5

輸出樣例:

6
 1 #include<iostream>
 2 #include<algorithm>
 3
#include<cstring> 4 using namespace std; 5 6 typedef long long LL; 7 8 const int N=100010; 9 10 int n,k; 11 LL a[N],s[N]; 12 LL cnt[N]; //存相同餘數的陣列 13 14 int main() 15 { 16 cin>>n>>k; 17 for(int i=1;i<=n;i++) cin>>a[i]; 18 for(int i=1;i<=n;i++) s[i]=s[i-1
]+a[i]; 19 20 LL res=0; 21 cnt[0]=1; 22 for(int i=1;i<=n;i++) 23 { 24 res+=cnt[s[i]%k]; 25 cnt[s[i]%k]++;//餘數相同的加一 26 } 27 cout<<res<<endl; 28 return 0; 29 }