首页 > 其他分享 >AcWing 1230. K倍区间

AcWing 1230. K倍区间

时间:2023-02-21 10:55:42浏览次数:46  
标签:cnt 1230 哈希 int 端点 区间 长度 AcWing

AcWing 1230. K倍区间

原题链接

视频讲解

思路

求区间的和为k的倍数的区间的个数。首先前缀和数组处理出来。

数据范围1e5,要想想O(n)或者O(logn)做法

将前缀和数组\(s[n]\)处理出来。

注意:
以i为右端点,长度为1的区间和为\(a[i]\),即\(s[i]-s[i-1]\)
以i为右端点,长度为2的区间和为\(a[i-1]+a[i]\),即\(s[i]-s[i-2]\)
...
以i为右端点,长度为i的区间和为\(a[1]+a[2]+...+a[i]\),即\(s[i]-s[0]\)即\(s[i]\)

我们枚举以i为右端点的区间,我们观察以i为右端的区间长度为1,2,3,...,i-1,i的区间和,即前缀和数组表达出来是\(s[i]-s[i-1]、s[i]-s[i-2]、s[i]-s[i-3],...,s[i]-s[1],s[i]-s[0]\)这些个值。

某个区间和为k的倍数:
比如\([i-1,i]\)这个区间\(s[i] - s[i-1] \equiv 0 \, (mod \, k)\),s[i]-s[i-1]是k的倍数,所以\(s[i]-s[i-1]\)与\(0\)模\(k\)同余。
所以有\(s[i] \equiv s[i-1] \, (mod \, k)\)
所以找模k余数相同的数的个数即可,使用哈希表来存储。

每个s[i]记录到哈希表\(cnt[s[i] \, mod \,k]\)

关于边界:s[0]也要去统计进哈希表 即需要先cnt[0] ++(以i为右端点,长度为i的区间)。

代码

#include<iostream>

using namespace std;

const int N = 1e5 + 10;
typedef long long LL;

int n,k;
LL s[N],cnt[N]; 

int main()
{
    cin >> n >> k;
    for(int i = 1;i <= n;i ++) 
    {
        cin >> s[i];
        s[i] += s[i-1];
    }
    
    LL res = 0;
    cnt[0] ++;
    for(int i = 1;i <= n;i ++)
    {
        res += cnt[s[i] % k];
        cnt[s[i] % k] ++;
    }
    cout << res;
    
    return 0;
}

标签:cnt,1230,哈希,int,端点,区间,长度,AcWing
From: https://www.cnblogs.com/rdisheng/p/17138482.html

相关文章

  • Acwing352 闇の連鎖(暗之连锁)
    涉及知识点:LCA,树上差分题意题目链接题目乱七八槽的说了一大通,但实际上抽象出来就是:有两种边,一种是主要边,一种是附加边,主要边构成一颗树,附加边为连接树上节点的非树边(注......
  • Acwing语法基础
    862.三元组排序-AcWing题库#include<iostream>#include<algorithm>#include<string>usingnamespacestd;structTriple{intx;floaty;stringz;......
  • acwing 截断数组
    原题链接题解分析s数组为前缀和数组,这里边录入边转换和能平均分为三份,意思是每一段的和都是s[n]/3先判断一下是否能被整除,分成三段,不能直接输出0,否则进行操作使用......
  • acwing 砖块
    原题链接题解分析这道题目使目标字符串变为同一颜色,也就使只有两种情况W/B因为操作时,操作i会将i+1也操作,所以总操作次数为n-1次如果不能变为全黑或全白也就是che......
  • acwing 318. 划分大理石
      多重背包及优化#include<bits/stdc++.h>usingnamespacestd;constintN=5e5+10;intc[N],S,n,f[N];intsolve(){ inti,j; S=0; memset(f,0,si......
  • hihoCoder 1078 : 线段树的区间修改
    #1078:线段树的区间修改10000ms1000ms256MB描述对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题改了改,又出给了小Ho:假设货架上......
  • acwing 316. 减操作
      类似背包f[i][sum]|=f[i-1][sum-a[i]],这里设置为1或-1 #include<bits/stdc++.h>usingnamespacestd;constintN=2e4+10;constintD=1e4;intn,m......
  • AcWing 3956. 截断数组 [前缀和]
    AcWing3956.截断数组[前缀和]原题链接讲解视频思路题意是将一串数字从中间切两刀分成三段。每一段的和都相等。要求这三段每一段的和都相等,那么总和肯定是3的倍数,......
  • 代码随想录算法训练营第三十五天 | 435. 无重叠区间,763.划分字母区间,56. 合并区间
    一、参考资料无重叠区间https://programmercarl.com/0435.%E6%97%A0%E9%87%8D%E5%8F%A0%E5%8C%BA%E9%97%B4.html划分字母区间https://programmercarl.com/0763.%E......
  • 区间和线段树的各种操作
    这篇文章我们来讲一下线段树线段树,适用于对一个数列区间进行操作,可以求这段数列\(i\)到\(j\)的和、乘积、最大值、最小值等等等等,因此线段树有十分多的变种问题提出如......