小L的区间求和

题目传送

此题解法真是妙哉,不服高人有罪啊,直接上代码 (PS:你妹的,你当时直接看代码看懂了)上li 子……

9 7 4 5 6 13 1 七个数K=3 sum[i]存的是1到i(下标从1开始)前i项和对K取模后的结果;sum的值依次是0 1 2 1 1 2 0 如果sum[i]等于0了,说明从1到i这个区间的和能被K整除,没毛病吧,那就更新一下结果呗,某:如果不等于0呢 俺:这个这个…… 请看比方说到了sum[6]这时等于2,你发现前面sum[3]也等于2,这就有搞头了,那么此时下标从4到6的区间和一定能被K整除,为什么呢?sum[2]%K之前的区间和一定可以表示为N1K+2,同理,sum[6]可以表示为N2K+2,对吧(N2K+2-(N1K+2))一定能被K整除滴嘛,妥了,某:你咋知道之前也有个2 呢,俺:就你能,代码扔你,自己看吧

#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll;
const int maxn=1e5+7;
int N,K;
int n[maxn];
ll sum[maxn];
map<int,int>M;//做标记用的
int main()
{
	while(~scanf("%d %d",&N,&K))
	{
		int i,j,cnt;
		int ans;
		sum[0]=0;
		for(i=1;i<=N;i++)
		{
			int n;
			scanf("%d",&n);
			sum[i]=(sum[i-1]+n)%K;//处理,搞一下
			M[sum[i]]=-1;
		}
		ans=0;
		for(i=1;i<=N;i++)
		{
			if(sum[i]==0)
			ans=max(ans,i);
			else if(M[sum[i]]!=-1)
			ans=max(ans,i-M[sum[i]]);   
			else
			M[sum[i]]=i;
		}
		printf("%d\n",ans);
	}
	return 0;
}

代码注释的好像都是屁话 跑路

全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务