感觉需要做一些杂题。
k倍区间,我们要先求数组的前缀和,这样才能对区间进行操作,我们用前缀和的余数来记录每一个余数的数量,当出现这个余数的时候,我们当前的前缀和减去前面的任意一个余数相同的前缀和,都能构成新的复合条件的区间;
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std ;
typedef long long LL ;
const int N = 1e5 +10 ;
LL a[N] ;
LL n ; LL k ;
LL ans ;
LL sum[N] ;//用于记录各个余数的的前缀和的数量
int main(){
cin >> n >> k ;
sum[0] = 1 ;
for(int i = 1 ; i <= n ; i ++){
cin >> a[i] ;
a[i] += a[i-1] ;//自身求前缀和
ans += sum[a[i]%k] ;//返回值加上当前,前面的余数相同的数量
sum[a[i]%k] ++ ; //再将当前这个余数为a[i]%k的记上数
}
cout << ans << endl ;
}