思路:说到子区间,前缀和一定用得上。但是n^2的做法显然超时。我们可以发现一个规律。如果前两个数的前缀和%k为2,前五个数的前缀和%k也为2,说明在这之间的区间一定满足,这样我们就有了新的算法。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[100009];
ll sumn[100009];
ll mod[100009];//储存前i个数模K余0到k-1的个数
ll ans;
int main()
{
ll n,k;
cin>>n>>k;
for(ll i=1;i<=n;i++)
{
cin>>a[i];
sumn[i]=sumn[i-1]+a[i];
ans+=mod[sumn[i]%k];
mod[sumn[i]%k]++;
if(sumn[i]%k==0) ans++;//这种情况要单独加上
}
cout<<ans;
}