题目传送
此题解法真是妙哉,不服高人有罪啊,直接上代码 (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;
}
代码注释的好像都是屁话 跑路