一段和
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;
}
浙公网安备 33010602011771号