感觉需要做一些杂题。
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 ; }