题目大意
给你n个数,和一个数p,求对n个数分割,最多有多少段的和为p的倍数
思路
计算前缀和模p,如果当前的前缀和模p的值,与前面某位置的前缀和模p的值相等,说明这一段的和是p的倍数,ans++,并将之前的“前缀和模p的值”清空,因为是连续的,所以后面肯定用不上了
代码
#include <bits/stdc++.h >
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int n, p, tmp, sum = 0, ans = 0;
cin >> n >> p;
set<int> st;
st.insert(0);
for (int i = 0; i < n; ++i) {
scanf("%d", &tmp);
sum = (sum + tmp) % p;
if (st.count(sum)) {
ans++;
sum = 0;
st.clear();
st.insert(0);
} else st.insert(sum);
}
cout << ans << endl;
}
return 0;
}