题目链接
题目大意:找出数列中和为k的倍数的连续子序列的最大个数。
题解:即为连续,那就考虑前缀数组。得到前缀数组后取模,由其性质可知,值相等的两个前缀数组元素之间的数就是要找的子序列。用map来加速找值相等的一对前缀数组元素。
AC代码:
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<iomanip>
#include<cmath>
#include<algorithm>
#include<string>
#include<map>
#include<string.h>
#include<time.h>
#include<queue>
#include<stack>
using namespace std;
int T,n,p,a[100005];
map<int,int> m;
int main(){
map<int,int> :: iterator it;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&p);
for(int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
a[i]=(a[i]+a[i-1])%p;
}
m.clear();
m[0]=1;
int ans=0;
for(int i=1;i<=n;++i)
{
it=m.find(a[i]);
if(it!=m.end())
{
++ans;
m.clear();
}
m[a[i]]=1;
}
printf("%d\n",ans);
}
return 0;
}