lanqiao OJ k倍区间

简介: lanqiao OJ k倍区间

用户登录

感觉需要做一些杂题。

k倍区间,我们要先求数组的前缀和,这样才能对区间进行操作,我们用前缀和的余数来记录每一个余数的数量,当出现这个余数的时候,我们当前的前缀和减去前面的任意一个余数相同的前缀和,都能构成新的复合条件的区间;

#include<iostream>
#include<cstring>
#include<algorithm>
 
using namespace std ;
typedef long long LL ;
const int N = 1e5 +10 ;
LL a[N] ;
LL n ; LL k ;
LL ans ;
LL sum[N] ;//用于记录各个余数的的前缀和的数量
int main(){
  cin >> n >> k ;
  sum[0] = 1 ;
  for(int i = 1 ; i <= n ; i ++){
    cin >> a[i] ;
    a[i] += a[i-1] ;//自身求前缀和
    ans += sum[a[i]%k] ;//返回值加上当前,前面的余数相同的数量
    sum[a[i]%k] ++ ; //再将当前这个余数为a[i]%k的记上数
  }
  cout << ans << endl ; 
} 
相关文章
lanqiaoOJ 563 采药
lanqiaoOJ 563 采药
lanqiaoOJ 211 剪格子
lanqiaoOJ 211 剪格子
lanqiao OJ 182 小朋友崇拜圈
lanqiao OJ 182 小朋友崇拜圈
lanqiao OJ 229 迷宫与陷阱
lanqiao OJ 229 迷宫与陷阱
lanqiao OJ 108 发现环
lanqiao OJ 108 发现环
lanqiao OJ 89 路径之谜
lanqiao OJ 89 路径之谜
acwing 1010 拦截导弹
acwing 1010 拦截导弹
lanqiaoOJ 2114 李白打酒加强版
lanqiaoOJ 2114 李白打酒加强版
lanqiao OJ 网络寻路
lanqiao OJ 网络寻路