题目链接:
https://www.acwing.com/problem/content/1232/
题解:
这个公式最重要s[r] - s[l-1] % k == 0 等价于 s[r]%k == s[l-1] % k
意思就是说,只要s[n]和s[m]模k的值一样,他们必然可以组成一个k倍区间
边界问题:s[0] = 1;
代码:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int N = 100010; int a[N]; ll sum[N]; int cnt[N]; int main(void){ int n,k; cnt[0] = 1; scanf("%d%d",&n,&k); long long res = 0; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); sum[i] += sum[i-1]+a[i]; } for(int i=1;i<=n;i++){ res += cnt[sum[i] % k]; cnt[sum[i] % k]++; } printf("%lld",res); return 0; }