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 }

 


 
posted @ 2022-04-05 20:57  不想做混子的奋斗远  阅读(40)  评论(0)    收藏  举报