P8649 [蓝桥杯 2017 省 B] k 倍区间:做题笔记

目录

思路 

代码思路

代码

推荐 


P8649 [蓝桥杯 2017 省 B] k 倍区间

思路 

额嗯,这道题我刚上来是想到了前缀和,但是还要判断每个子序列,我就两层for嵌套,暴力解了题。就是我知道暴力肯定过不了但是写不出来其他的[留下了苦涩的眼泪hh]

这道题用到了数学知识:同余定理:给定一个正整数m,如果两个整数a和b满足a-b能够被m整除,即 (a-b)/m得到一个整数,那么就称整数a与b对模m同余,记作a≡b (mod m)。

也就是如果两个数对k取余,且余数相同,那么这两个数相减再对k取余,就会得到余数是0,也就是整除了。

那么对应到我们这道题里,我们按正常方法计算出前缀和,在对每一个前缀和的值进行对k取余,用一个数组来存储对应余数出现的次数,在这些具有相同余数的数中,任取两个数进行相减都会得到一段满足条件的K倍区间。(这里注意理解一下 数与区间 的转化,因为我们进行相减的数是某个前缀和,也就是某段区间的和,那么既然是两个区间的相减,得到的也就是一段符合条件的区间)

这个任取的过程用数学知识可以表示为Cx(下标)2(上标)

代码思路

① 

这道题我们甚至可以不开前缀和数组,因为我们计算同余数字的个数的话,其实只对最初求出的前缀和进行取模操作,而不需要对某两个前缀和进行处理,也就是说,其实这个前缀和数组我们也只是使用到了一次而已,因此,在这里不设前缀和数组和前缀和算法中原数组可以不设的原因是一样的,我们可以直接设一个变量来表示每个数与前一个数相加的和。

为了避免每次输入进来的数据太大,我们甚至可以直接在把这个数加到前缀和中的时候就直接加该数对k取模之后的余数的值,因为我们最后也是要对每个前缀和取模的嘛。

(我想表达的是这样:)

for(int i=1;i<=n;i++){int x;cin>>x;sum+=x%k;//直接用sum一个变量表示每次更新的前缀和,每次更新即可。s[sum%k]++;sum%=k;}

 ③

说一下Cx(下标)2(上标)应该怎样计算,看着好像无从下手(我无从下手doge),其实很简单,就把它按数学里学的那样展开,就得到=(x*(x-1))/2就可以啦

另外有一点,我们最终进行计算的主要是围绕每个相同余数的数的个数,也就是s数组,要考虑到当余数是0的时候,其实相较于我们的通式(x*(x-1))/2是要多1的,可以通过举例来得到。因此对于s数组0所对应的初始值应该为1.

具体的解释可以看这个博主的题解(我也是主要看这个博主看明白哒)

【题解】P8649 题解

代码

#include<iostream>
#define int long long
using namespace std;
const int N=1e5+10;
int n,k;
int s[N];//用来存储同一个余数的个数
signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n>>k;int sum=0;s[0]=1;for(int i=1;i<=n;i++){int x;cin>>x;sum+=x%k;s[sum%k]++;sum%=k;}int cnt=0;for(int i=0;i<k;i++)//遍历所有可能的相同余数{cnt+=(s[i]*(s[i]-1))/2;}cout<<cnt;return 0;} 

关于代码中一些书写上的 

ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);

这三行是提速的。

#define int long long
...
signed main()

这里是为了避免忘记开long long导致丢分写的,也就是表示我们用int这个外号来表示long long 的新名字,这样写的话下面主函数int main() 记得前面的int变成 signed。

如果想了解更清晰的,可以看这个up猪的完整视频,我是蒟蒻hhh

【[蓝桥杯]避免常见坑点(输入输出问题、数据溢出问题等)】

这个就看个人习惯了. 

推荐 

这个博主简化了 Cx(下标)2(上标) 的计算过程,代码更简洁清晰,感兴趣可以看一下

17行代码解决

或许可以帮助大家理解 


呜呜感觉好菜呀🥀🥀🥀

有问题欢迎指出,一起加油!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/775513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ESP32S3 Sense接入语音识别+MiniMax模型对话】

1. 前言 围绕ESP32S3 Sense接入语音识别MiniMax模型对话展开&#xff0c;首先串口输入“1”字符&#xff0c;随后麦克风采集2s声音数据&#xff0c;对接百度在线语音识别&#xff0c;将返回文本结果丢入MiniMax模型&#xff0c;进而返回第二次结果文本&#xff0c;实现语言对话…

libVLC 动态视频壁纸

在 Windows 上&#xff0c;你可能需要使用 Windows API 来设置壁纸&#xff0c;而在 Linux 上&#xff0c;你可能需要使用某种桌面环境特有的方法。在 macOS 上&#xff0c;这一功能可能受到限制。 效果图如下所示&#xff1a; 以下是一个简单的示例&#xff0c;说明了如何在 …

[Qt] QString::fromLocal8Bit 的使用误区

QString::fromLocal8Bit 是一个平台相关的函数。默认情况下在 Windows 下 就是 gbk 转 utf-8 ,在 Linux就应该是无事发生。因为Linux平台默认的编码方式就是 utf-8 可以通过 void QTextCodec::setCodecForLocale(QTextCodec *c)来修改 Qt默认的编码方式。如下 第一输出乱码的…

vue组件如何使用?

今天我随便试两个组件 第一个轮播图 在minn.js 引入 import { createApp } from vue; import { Swipe, SwipeItem } from vant; const app createApp(); app.use(Swipe); app.use(SwipeItem); <van-swipe class"my-swipe" :autoplay"3000" indica…

python学习15:python中的input语句

python中的input语句 我们前面学习过print语句&#xff0c;可以将内容输出到屏幕上&#xff1b;在python中&#xff0c;与之对应的还有一个input语句&#xff0c;用来获取键盘输入。 数据输出&#xff1a;print 数据输入&#xff1a;input 使用上也很简单&#xff1a; 使用inp…

视图的作用

目录 视图的作用 创建视图 为 scott 分配创建视图的权限 查询视图 复杂视图的创建 视图更新的限制问题 更新视图中数据的部门编号&#xff08;视图的存在条件&#xff09; 限制通过视图修改数据表内容 创建只读的视图 复杂视图创建 oracle从入门到总裁:​​​​​​h…

快速创建zookeeper集群

先说明&#xff0c;我很穷&#xff01;&#xff01;&#xff0c;开不了多个虚拟机&#xff0c;zookeeper集群的3个节点都放在同一个虚拟机&#xff0c;所以搭建是一个伪集群&#xff0c;因为一个服务器挂机&#xff0c;所有节点都会停止。工作实际情况安装到三个服务器&#xf…

H5抓包——Android 使用电脑浏览器 DevTools调试WebView

H5抓包——Android 使用电脑浏览器 DevTools调试WebView 一、使用步骤 1、电脑通过数据线连接手机&#xff0c;开启USB调试&#xff08;打开手机开发者选项&#xff09; 2、打开待调试的H5 App&#xff0c;进入H5界面 3、打开电脑浏览器&#xff0c;调试界面入口 如果用ed…

第十一章:位运算符与位运算

文章目录 第十一章&#xff1a;位运算符与位运算1.按位与运算&#xff1a;&2.按位或运算&#xff1a;|3.按位异或运算&#xff1a;^4.取反运算符&#xff1a;~5.左移运算符&#xff1a;<<6.右移运算符&#xff1a;>>总结 第十一章&#xff1a;位运算符与位运算…

免费SSL证书和付费SSL证书的区别点

背景&#xff1a; 在了解免费SSL证书和付费SSL证书的区别之前&#xff0c;先带大家了解一下SSL证书的概念和作用。 SSL证书的概念&#xff1a; SSL证书就是基于http超文本传输协议的延伸&#xff0c;在http访问的基础上增加了一个文本传输加密的协议&#xff0c;由于http是明…

【爬虫基础】第6讲 opener的使用

在爬虫中&#xff0c;opener是一个用来发送HTTP请求的对象。它可以用来模拟浏览器发送请求&#xff0c;包括设置请求头、处理Cookie等操作。使用opener可以实现一些高级功能&#xff0c;如模拟登录、处理验证码等。 方法1&#xff1a; from urllib.request import Request,bu…

ARMday7作业

实现三个按键的中断&#xff0c;现象和代码 do_ipr.c #include "stm32mp1xx_gic.h" #include "stm32mp1xx_exti.h" extern void printf(const char *fmt, ...); unsigned int i 0; void do_irq(void) {//获取要处理的中断的中断号unsigned int irqnoGI…

StableDiffusion Web UI开启FP8,极大节约显存

升级了Pytorch后&#xff0c;StableDiffusion最新版本就可以有使用FP8的基础了&#xff0c;因此把秋叶的LINUX包也升级到了最新的版本。 升级Pytorch参考我的升级记录&#xff1a; ComfyUI SDWebUI升级pytorch随记-CSDN博客 然后下一步就是如何开启FP8了。与ComfyUI不同&…

Spring boot2.X 配置https

背景 最近项目组说要将 http 升级成 https 访问&#xff0c;证书也给到我们这边了&#xff0c;当然我们这边用的是个二级域名&#xff0c;采用的是通配符访问的方式&#xff0c;比如一级域名是这样&#xff08;com.chinaunicom.cn&#xff09;&#xff0c;我们的则是&#xff0…

【安全用电管理系统的应用如何保证用电安全】Acrel-6000安科瑞智慧安全用电解决方案

政策背景 国家部委 ※2017年5月3日国务院安委会召开电气火灾综合治理工作视频会议&#xff0c;决定在全国范围内组织开展为期3年的电气火灾综合治理工作。 公安部领导 ※公安部副部长李伟强调&#xff1a;向科技要战斗力&#xff0c;加快推进“智慧消防”建设不断提升火灾防控…

区块链食品溯源案例实现(二)

引言 随着前端界面的完成&#xff0c;我们接下来需要编写后端代码来与区块链网络进行交互。后端将负责处理前端发送的请求&#xff0c;调用智能合约的方法获取食品溯源信息&#xff0c;并将结果返回给前端。 通过前后端的整合&#xff0c;我们可以构建一个食品溯源系统&#xf…

ArrayList和LinkedList有什么区别?

ArrayList和LinkedList的区别 ArrayList 和 LinkedList 是 Java 中常用的两种集合类&#xff0c;它们都实现了 List 接口&#xff0c;但在内部实现和性能上有一些区别。 内部实现&#xff1a; ArrayList 使用数组实现&#xff0c;它的元素在内存中是连续存储的&#xff0c;每…

【C语言】linux内核pci_iomap

一、pci_iomap /** pci_iomap 是一个用于映射 PCI 设备的 BAR&#xff08;Base Address Register&#xff0c;基地址寄存器&#xff09;的函数。* 此函数返回指向内存映射 IO 的指针&#xff0c;用于直接访问 PCI 设备的内存或 I/O 空间。* * 参数:* dev - 指向pci_dev结构的指…

JDK8的下载安装与环境变量配置教程

前言 官网下载&#xff1a;Java Archive Downloads - Java SE 8u211 and later 现在应该没人用32位的系统了吧&#xff0c;直接下载Windows x64 Installer jdk-8u391-windows-x64.exe 一、安装JDK 1. 打开jdk-8u391-windows-x64.exe 2. 直接下一步 3. 这个地方不要动他&…

servlet开发详解

一、什么是servlet&#xff0c;干什么用的&#xff1f;&#xff1f;&#xff1f; tomcat作为一个web服务器&#xff0c;也称作servlet容器。servlet只有放在web服务器中才能运行&#xff0c;不能独立运行。tomcat这个容器要做三件事&#xff1a;接收请求、处理请求和响应请求。…