思路解析:
拿样例来说:
6 3
1 1 4 5 1 4
1 1 4 | 5 1 | 4
如何在遍历到1的时候使得5跟1快速匹配而被分到一组当中呢?
我们使用前缀和来观察一下
1 2 6 11 12 16
还是不好看,对题目描述的k(这里为3)取模再来观察
1 2 0 2 0 1
由此可知俩0刚好相等就意味着从匹配到俩相等的数的第一个数后的一个数(这里是2已标红)起,到另外一个相等的数(另一个0)结束这一段刚好是原数组中的5跟1,这样就分好了组。
建议使用set容器(方法:count())来匹配相等的数
废话不多说,代码如下:
#include<bits/stdc++.h>
using namespace std;
#define int long long
using T = pair<int, int>;
set<int>S;
//unordered_map<int, int>mp;
const int N = 2e5 + 10;
int a[N];
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n, k; cin >> n >> k;
int pos{ 1 }, i, j, ans{};
for (i = 1; i <= n; ++i) {
cin >> a[i];
a[i] += a[i - 1];
}
S.insert(0);
for (i = 1; i <= n; ++i) {
if (S.count(a[i] % k)) {
ans++;
S.clear();
S.insert(a[i] % k);
}
else {
S.insert(a[i] % k);
}
}
cout << ans;
return 0;
}