N个正整数,如果连续的一段(可能是一个数)和能被M整除,输出这一段的开始位置和结束位置。如果答案有多段,输出结束位置最前面的一段。
输入格式
第一行:2个正整数N和M,范围 1<M<N<100000。
第二行:N个正整数,每个数范围[1,10000]。
输出格式
2个正整数。
- 看到题目叫“一段和”,立刻就想到了前缀和
- 前缀和数组要开long long!!!
- 如果i位置和j位置的元素模m的余数相同,则[i+1,j]的和是m的倍数
- 余数可以用map统计
#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;
}
标签:正整数,int,位置,long,mp,一段
From: https://www.cnblogs.com/algorithm-hu/p/18002519