题意:n个数,相邻两数可经过无限次相加,求经过操作后该数列中是p的倍数的数的最多个数。
思路:利用贪心算法,从左至右判断,如果一个区间之中存在操作后求模p的两个值相等,那么这个区间就一定存在加起来是p的倍数的数,,因为只有加上p的倍数才会使其求模后不变。m=n%p=(n+k*p)%p.
cin与cout的使用注意加入ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0);
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int v[maxn];
map<int,int> mp;
int sum,j,x;
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int tcase,n,p,ans;
cin>>tcase;
while(tcase--){
cin>>n>>p;
mp[0]=1;
sum=0;
ans=0;
for(int i=0;i<n;i++){
cin>>x;
sum=(sum + x) % p;
if(mp.count(sum)){//count()返回指定元素sum出现的次数
ans++;
sum=0;
mp.clear();
mp[0]=1;
}
else{
mp[sum]=1;
}
}
v[j++]=ans;
mp.clear();
}
for(int i=0;i<j;i++){
cout<<v[i]<<endl;
}
return 0;
}