第八届蓝桥杯省赛C++B组 K倍区间(思维)

acwing评测地址:https://www.acwing.com/problem/content/description/1232/

解析:

很容易想到前缀和。但是n*n很明显不行

对于[L,R],如果为k的倍数那么:

(sumR-sumL-1)%k==0

那么sumR%k==sumL-1%k

但是这么写的话,会忽略掉前缀和为0的情况:1~i 和%k==0

所以末尾加上就好了。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e5 + 5;
int a[maxn];
int main()
{
    int n,k;
    map<int,int>mp;
    cin>>n>>k;
    int sum = 0;
    ll ans = 0;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        sum=(sum+a[i])%k;
        ans+=mp[sum];
        mp[sum]++;
    }
    cout<<ans+mp[0]<<endl;
}
原文地址:https://www.cnblogs.com/liyexin/p/13822640.html