一段和

N个正整数,如果连续的一段(可能是一个数)和能被M整除,输出这一段的开始位置和结束位置。如果答案有多段,输出结束位置最前面的一段。

输入格式
第一行:2个正整数N和M,范围 1<M<N<100000。
第二行:N个正整数,每个数范围[1,10000]。

输出格式
2个正整数。


  • 看到题目叫“一段和”,立刻就想到了对数组A求前缀和S
  • A和S要开long long!!!
  • 如果Si和Sj模m的余数(除了0之外)相同,说明[S(i+1), Sj]的和是m的倍数————[i+1,j]就是答案
  • 某个余数在之前是否出现,可以用map统计
  • 注意余数为0时的特判:答案的左区间一定是0+1=1

#include<bits/stdc++.h>
using namespace std;
long long a[100005],b[100005];
int main() {
int n,m;
cin>>n>>m;
map<int,int> mp;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=b[i-1]+a[i];
int k=b[i]%m;
if(mp[k]==0 && k!=0)
mp[k]=i;
else{
cout<<mp[k]+1<<" "<<i;
return 0;
}
}
return 0;
}

posted on   可爱楷玩算法  阅读(20)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示