思路
先求前缀和,然后把前缀和%p。如果有两个位置的数相等,说明这段区间的和是p的倍数。统计相同的值。
代码
#include <bits/stdc++.h>
#define hi cout<<"hi\n";
#define inf 0x3f3f3f3f
#define ll long long
#define ull unsigned long long
using namespace std;
const ll mod = 1000000009;
const int maxn = 100005;
ll gcd(int a,int b)
{
if(b==0)
return a;
else
return gcd(b,a%b);
}
ll lcm(int a,int b)
{
return a/gcd(a,b)*b;
}
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
int T;
cin>>T;
while(T--)
{
int n,p;
cin>>n>>p;
ll a[maxn],ans=0;
for(int i=0;i<n;i++)
cin>>a[i];
a[0]%=p;
for(int i=1;i<n;i++)
a[i]=(a[i-1]+a[i])%p;
set<ll> s;
s.insert(0);
for(int i=0;i<n;i++)
{
if(!s.insert(a[i]).second)
{
ans++;
s.clear();
s.insert(a[i]);
}
}
cout<<ans<<endl;
}
}