0
点赞
收藏
分享

微信扫一扫

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

秀妮_5519 2022-09-26 阅读 50

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

解析:

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

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

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

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

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

但是这么写的话,会忽略掉前缀和为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;
}

 



举报

相关推荐

0 条评论