acwing-K倍區間
阿新 • • 發佈:2022-04-05
給定一個長度為 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 倍區間的數目。
資料範圍
1≤N,K≤1000001≤N,K≤100000,
1≤Ai≤1000001≤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 }