当前位置:   article > 正文

蓝桥杯备战22.k倍区间——前缀和

蓝桥杯备战22.k倍区间——前缀和

目录

题目

分析

暴力求解

优化思路

AC代码


题目链接:

P8649 [蓝桥杯 2017 省 B] k 倍区间 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目

分析

很明显这题是一道前缀和的题

暴力求解

只得了28分

  1. #include<iostream>
  2. using namespace std;
  3. const int N = 2e5+10,M=1e3+10;
  4. int a[N],pre[N];
  5. int main()
  6. {
  7. int n,k;cin>>n>>k;
  8. for(int i=1;i<=n;i++)
  9. {
  10. cin>>a[i];
  11. pre[i]=pre[i-1]+a[i];
  12. }
  13. int ans = 0;
  14. for(int i=0;i<n;i++)
  15. {
  16. for(int j=i+1;j<=n;j++)
  17. {
  18. if((pre[j]-pre[i])%k==0)ans++;
  19. }
  20. }
  21. cout<<ans;
  22. return 0;
  23. }

优化思路

同余定理,当他们的模数相同时候,做差的模为0

AC代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. const int N = 2e5+10,M=1e3+10;
  5. int a[N],pre[N];
  6. signed main()
  7. {
  8. map<int,int>mp;
  9. int n,k;cin>>n>>k;
  10. for(int i=1;i<=n;i++)
  11. {
  12. cin>>a[i];
  13. pre[i]=(pre[i-1]+a[i])%k;
  14. mp[pre[i]]++;
  15. }
  16. int ans = 0;
  17. for(auto i:mp)
  18. {
  19. if(i.first==0)
  20. {
  21. ans+=i.second*(i.second+1)/2;
  22. }
  23. else
  24. {
  25. ans+=i.second*(i.second-1)/2;
  26. }
  27. }
  28. cout<<ans;
  29. return 0;
  30. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/606537
推荐阅读
相关标签
  

闽ICP备14008679号