ubsequences Summing to Sevens S

题目链接:https://www.luogu.com.cn/problem/P3131

题意:

求是7的倍数的最长的区间长度

思路:

对于两个数a,b: (a-b)(mod m) = 0 => a (mod m) = b (mod m)
所以对于所有%7后的前缀区间,假设左边l点%7后等于右边r点%7,那么(pre[r]-pre[l]) (mod 7)=0
即为7的倍数区间
长度为最长的r-l
0最早出现在0位置

int vis[8];
void solve(){
	int n;cin>>n;
	vector<int>a(n+1);
	vector<int>pre(n+1);
	vector<int>p(n+1);
	for(int i=0;i<7;i++){
		vis[i]=-1;
	}
	for(int i=1;i<=n;i++){
		cin>>a[i];
		p[i]=p[i-1]+a[i];
		pre[i]=p[i]%7;
	}
	int ans=0;
	vis[0]=0;
	for(int i=1;i<=n;i++){
		if(vis[pre[i]]==-1)vis[pre[i]]=i;
		else{
			ans=max(ans,i-vis[pre[i]]);
		}
	}
	cout<<ans<<endl;
}
posted @ 2025-04-10 21:00  Marinaco  阅读(11)  评论(0)    收藏  举报
//雪花飘落效果