90pts求调
查看原帖
90pts求调
1386046
Yilia0929楼主2025/6/28 11:01
#include<bits/stdc++.h>
using namespace std;
long long n,k,ans=-1,x,y;
long long a[100005],b[100005];
map<int,int> m;
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		b[i]=b[i-1]+a[i]%k;
		b[i]%=k;
	}
	for(int i=1;i<=n;i++){
		if(m[b[i]]==0) m[b[i]]=i;
		else{
			if(ans<=i-m[b[i]]){
				ans=i-m[b[i]];
				x=m[b[i]]+1;
				y=i;
			}
		}
	}
	cout<<ans<<endl;
	if(ans!=-1){
		for(int i=x;i<=y;i++) cout<<a[i]<<" ";
	}
}

大致思路就是前缀合数组中每位都对k取模,那如果数组中有两个相同的就分别是合法子段第一个的前一个和子段的最后一个

2025/6/28 11:01
加载中...