#include <bits/stdc++.h>
using namespace std;
int sb(int n, int s, vector<int>a) {
unordered_map<int, int> msp;
msp[0] = -1;
int sum = 0;
int len = -1;
for (int i=0;i<n;i++) {
sum+=a[i];
int m=sum%s;
if (msp.find(m)==msp.end()) {
msp[m]=i;
} else {
len=max(len,i-msp[m]);
}
}
return len;
}
int main() {
int t;
cin>>t;
while (t--) {
int n,s;
cin>>n>>s;
vector<int>a(n);
for (int i=0;i<n;i++) {
cin>>a[i];
}
int r=sb(n,s,a);
cout <<r<<endl;
}
return 0;
}
你的思路说一下
1 个赞
前缀和+模运算
1 个赞
我是前缀和之后直接for循环搜
2 个赞
???
1 个赞
for(int i=0;i<=n;i++)
{
//判断,找到后就break
}
for(int i=n;i>=1;i--)
{
//判断,找到后就break
}
1 个赞
前面就前缀和
1 个赞
再详细一点
#include<bits/stdc++.h>
using namespace std;
int T,n,s;
int main()
{
cin>>T;
while(T--)
{
cin>>n>>s;
int a[n+1]={0},b[n+1]={0},ans=INT_MAX;
for(int i=1;i<=n;i++)输入
for(int i=1;i<=n;i++)前缀和数组
for(int i=0;i<=n;i++)
{
if(判断条件)
{
ans=min(ans,n-i);
break;
}
}
for(int i=n;i>=1;i--)
{
if(判断条件)
{
ans=min(ans,i);
break;
}
}
if(判断有没有答案)cout<<-1<<endl;
else cout<<ans<<endl;
}
return 0;
}
2 个赞

