[蓝桥杯2017初赛]k倍区间(前缀和)

传送门

思路:说到子区间,前缀和一定用得上。但是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;
}
posted @ 2020-02-02 19:52  倾叶子佮  阅读(122)  评论(0)    收藏  举报