k倍区间
-
题意:给定一个数组A[N],若子序列A[i] .... A[j]和为k的倍数,则[i,j]称为k倍区间,求k倍区间的数量。
-
解析:区间和 \(\Rightarrow\) 前缀和。
(s[r] - s[l - 1])% k == 0\(\Rightarrow\)s[r] % k == s[l - 1] % k(同余),再利用cnt[N]计数即可。#include<iostream> using namespace std; using ll = long long; const int N = 1e5 + 10; int n,k,cnt[N]; ll ans,s[N]; int main() { cin>>n>>k;cnt[0]++; for(int i = 1; i <= n; ++i)cin>>s[i],s[i] += s[i - 1]; for(int i = 1; i <= n; ++i)ans += cnt[s[i] % k],cnt[s[i] % k] ++; cout<<ans<<endl; return 0; }
浙公网安备 33010602011771号