传送门
Solution
首先拆环成链,令 ai+n=ai。
然后求出 ai 的前缀和 si。当 si≡sj(modM) 时,说明 M∣ai+1+⋅⋅⋅+aj。
遍历 si,开桶记录属于不同余数的 si 数量,并计算答案。
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #include <bits/stdc++.h> using namespace std; typedef long long ll;
const ll N = 2e5 + 10;
ll n, m, a[N << 1], sum[1000010], ans;
int main() { scanf("%lld%lld", &n, &m); for (int i = 1; i <= n; i++) { scanf("%lld", &a[i]); a[i + n] = a[i]; } sum[0]++; for (int i = 1; i < n * 2; i++) { a[i] = (a[i] + a[i - 1]) % m; sum[a[i]]++; if (i - n >= 0) sum[a[i - n]]--; ans += sum[a[i]] - 1; if (i >= n) sum[a[i]]--; } printf("%lld", ans); return 0; }
|