题目链接
题目大意:找出数列中和为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;
}