很简单但很坑
进行一次前缀和操作后(),使用下面的公式
坑点1
坑点2
前缀和开始记录数据,. 但是最后用map记录的时候却是从0开始的。
#include<bits/stdc++.h>
using namespace std;
//省略一些宏
//---------------------
#define MAXN 200005
//---------------------
ll n,k;
ll arr[MAXN];
ll res;
int main(){
cin >> n >> k;
REP1(i,n) cin>>arr[i];
res = 0 ;
ll sum[MAXN];
sum[0] = 0;
REP1(i,n) sum[i] = (sum[i-1] + arr[i])%k;
DBSTART
PRTLST(sum,n);
DBEND
ll v[MAXN];
REP(i,n+1) v[i] = ( sum[i]%k - i%k + k ) % k;
DBSTART
PRTLST(v,n);
DBEND
map<ll,ll> ct;
REP(i,n+1){
ll l = i-k;
if(l >= 0) ct[v[l]]--;
res += ct[v[i]];
ct[v[i]]++;
}
PRT(res);
return 0;
}