一段和

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 2024-02-02 09:05  可爱楷玩算法  阅读(32)  评论(0)    收藏  举报

导航