目录
题目链接:
P8649 [蓝桥杯 2017 省 B] k 倍区间 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目
分析
很明显这题是一道前缀和的题
暴力求解
只得了28分
cpp
#include<iostream>
using namespace std;
const int N = 2e5+10,M=1e3+10;
int a[N],pre[N];
int main()
{
int n,k;cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
pre[i]=pre[i-1]+a[i];
}
int ans = 0;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<=n;j++)
{
if((pre[j]-pre[i])%k==0)ans++;
}
}
cout<<ans;
return 0;
}
优化思路
同余定理,当他们的模数相同时候,做差的模为0
AC代码
cpp
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5+10,M=1e3+10;
int a[N],pre[N];
signed main()
{
map<int,int>mp;
int n,k;cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
pre[i]=(pre[i-1]+a[i])%k;
mp[pre[i]]++;
}
int ans = 0;
for(auto i:mp)
{
if(i.first==0)
{
ans+=i.second*(i.second+1)/2;
}
else
{
ans+=i.second*(i.second-1)/2;
}
}
cout<<ans;
return 0;
}