首页 > 编程语言 >AcWing 1230. K倍区间 C++满分题解

AcWing 1230. K倍区间 C++满分题解

时间:2024-03-21 23:00:44浏览次数:23  
标签:cnt 1230 前缀 int 题解 sum C++ Long left

原题链接https://www.acwing.com/problem/content/1232/

题目分析

求区间和,我们可以通过前缀和来求出。

我们规定sum[i]表示第1个元素到第i个元素的和。那么sum[r] - sum[l-1]就是区间[l,r]的和。

一维前缀和

for (int i = 1; i <= n; i ++ ){
    scanf("%lld", &sum[i]);
    sum[i] += sum[i - 1];
}

线性同余定理:sum[r] % k 和 sum[l-1] % k 如果相等,那么sum[r] - sum[l-1]的差值必然是k的倍数

代码细节

求和值和结果均可能达到1e10数量级,因此用Long Long定义sum[N],cnt[N]和res;

当输入时就建立好前缀和数组

for循环遍历前缀和数组,首先把第i个当作sum[right],前面有几个同余数的前缀和,res就加几。

然后将第i个当作sum[left](增加了sum[left]的数量)

C++代码

#include<bits/stdc++.h> 
using namespace std;

typedef long long LL;
const int N = 1e5 + 5;
int n, k;
LL sum[N], cnt[N];//cnt统计每个余数对应的前缀和个数 

int main(){
    scanf("%d%d", &n, &k);
    for (int i = 1; i <= n; i ++ ){
        scanf("%lld", &sum[i]);
        sum[i] += sum[i - 1];
    }
    
    LL res = 0; 
    cnt[0] = 1;//假设第0个数字余数是0; 
    for (int i = 1; i <= n; i ++ ){
        res += cnt[sum[i] % k];//检查第i个数字前缀和前面有几个前缀和与它同余 
        cnt[sum[i] % k] ++ ;
    }
    printf("%lld\n", res);
    return 0;
}

标签:cnt,1230,前缀,int,题解,sum,C++,Long,left
From: https://blog.csdn.net/boomgloom/article/details/136921697

相关文章

  • cfRound935div3--DEFG题解
    ps:这场因为精神状态不佳,又C题题意有点绕,卡题了,头晕找不到错.最后做了两题就溜了.狠狠扣90分..D-SeraphimtheOwl题意:即选一个位置,使得其满足题意。而且在满足题意的基础上,要靠近中心越好,如果满足题意而且靠近中心的距离一样,那么输出前面那个.intcnt0[300005]={0};......
  • 限流器(流控)+ 线程 C++实现
    在C++中,你可以使用互斥锁(mutex)和条件变量(conditionvariable)来实现一个简单的限流器(流控)以及线程。下面是一个简单的例子,它创建了一个限流器类,该类允许一定数量的线程同时访问某个资源。#include<iostream>#include<thread>#include<mutex>#include<condition_variable>......
  • C++反射
    反射教程让程序看到自己的数据,并且能够对数据进行操作类型萃取对类型做萃取,有一组混合类型,将特定类型获取出来核心思路:使用模板来匹配查找例子:指针类型萃取解除一层指针,三级变二级,二级变一级template<typenameT>structremove_pointer{};template<typenameT>stru......
  • P5664 [CSP-S2019] Emiya 家今天的饭 题解
    题目链接:P5664[CSP-S2019]Emiya家今天的饭思路:显然可以算出总数减去不合法的,不合法即有一列超过一半,显然最多一列,枚举这一列。考虑dp,设\(f(i,j,k)\)表示前\(i\)个方法,\(j\)个这一列,\(k\)个其他列。但是这样是\(O(n^3m)\),我们需要优化。显然我们只关心\(j,k\)相......
  • C++版数据结构与算法
    大家好,今天开始给大家每天带来C++版的数据结构与算法,后面也会包括C#的系统学习。这段代码是一个C++实现的排序算法集合。其中包括选择排序(selectionsort)、冒泡排序(bubblesort)、插入排序(insertionsort)和归并排序(mergesort)。算法后越往后越难,此次做这个系列博客,是想从......
  • 23种设计模式核心思想及代码实现(Java C++)
    目录代码OOP七大原则策略模式单例模式观察者模式装饰模式抽象工厂模式工厂模式简单工厂模式工厂模式抽象工厂模式三种工厂模式的区别简单工厂模式和策略模式的不同pipeline模式职责链模式代理模式静态代理动态代理......
  • 语音转文字——sherpa ncnn语音识别离线部署C++实现
    简介Sherpa是一个中文语音识别的项目,使用了PyTorch进行语音识别模型的训练,然后训练好的模型导出成torchscript格式,以便在C++环境中进行推理。尽管PyTorch在CPU和GPU上有良好的支持,但它可能对资源的要求较高,不太适合嵌入式环境或要求轻量级依赖的场景。考虑到模......
  • C++ this指针
    1. this指针的用处一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时......
  • 复试C++16真题_程序设计1_输出句子中每个单词长度
    输入一行文本,按照相应格式输出每个单词的长度#include<iostream>usingnamespacestd;#include<string>#include<vector>#include<iomanip>intmain(){stringsen="qweasdaxszfsfsddwfas";//getline(cin,sen);如果要把输入的空格的记录......
  • [CF845G] Shortest Path Problem? 题解
    [CF845G]ShortestPathProblem?题解注意到如果我们在路径中多走了一个环,那么得到的贡献就是这个环的贡献。对于这种有关环的问题,考虑一棵生成树,这样所有环都可以用一条祖先边和一些树边组成,发现选环走的过程是独立的,考虑把所有环的权值丢进线性基里,然后查询xordist[1]^xor......