CSP-X2024山东小学组T2:消灭怪兽

ops/2024/11/17 1:51:47/

题目链接

题目名称

题目描述

怪兽入侵了地球!

为了抵抗入侵,人类设计出了按顺序排列好的 n n n 件武器,其中第 i i i 件武器的攻击力为 a i a_i ai,可以造成 a i a_i ai 的伤害。

武器已经排列好了,因此不能改变顺序。某件武器可以单独攻击,也可以与相邻的武器进行组合攻击。

具体来说,每次你可以把相邻的若干个(可以为 1 1 1 个,即不进行组合)连续
的武器组合起来进行攻击,则攻击力为这些连续的武器攻击力之和。

来自外星的怪兽拥有无敌护盾,不会受到任何伤害。但是人类在交战过程中发现怪兽有个致命的弱点:每次当受到 k k k k k k 的倍数的伤害时,怪兽的无敌护盾就能被打破。

请你帮助人类求出有多少种组合武器的方案,使得造成的伤害能打破怪兽的无敌护盾。

输入格式

第一行两个正整数 n , k n, k n,k 如题所述; 第二行为 n n n 个正整数,其中第 i i i 个数 a i a_i ai 表示第 i i i 件武器的攻击力。

输出格式

一行一个整数表示答案。

样例

样例输入 #1

5 3
1 2 3 4 5

样例输出 #1

7

样例输入 #2

10 11
1 4 8 10 16 19 21 25 30 43

样例输出 #2

7

样例输入 #3

6 2
2 2 2 2 2 2

样例输出 #3

21

提示

【样例1解释】
k = 3 k=3 k=3,而区间 [1, 2],[1, 3],[1, 5],[2, 4],[3, 3],[3, 5],[4, 5] 的区间
和均为 3 3 3 3 3 3 的倍数,故一共有 7 7 7 种方案。

【数据范围】

  • 20% 的数据, n , k ≤ 100 n, k ≤ 100 n,k100
  • 40% 的数据, n , k ≤ 10000 , 1 ≤ a i ≤ k n, k ≤ 10000,1 ≤ a_i ≤ k n,k10000,1aik
  • 另外存在10% 的数据, k = 2 k = 2 k=2
  • 另外存在10% 的数据,所有的 a i a_i ai 均相等。
  • 100% 的数据, 1 ≤ n ≤ 1 0 6 1 ≤ n ≤ 10^6 1n106 , 2 ≤ k ≤ 1 0 6 2 ≤ k ≤ 10^6 2k106 , 1 ≤ a i ≤ 1 0 9 1 ≤ a_i ≤ 10^9 1ai109

算法思想

朴素版前缀和

根据题目描述,只需要预处理出前缀和,然后枚举区间的开始位置 L L L和结束位置 R R R,判断 S [ R ] − S [ L − 1 ] S[R]-S[L-1] S[R]S[L1]是否为 k k k的倍数就可以了。

时间复杂度

  • 处理前缀和的时间复杂度为 O ( n ) O(n) O(n)
  • 枚举开始和结束位置的时间复杂度为 O ( n 2 ) O(n^2) O(n2)

总的时间复杂度为 O ( n 2 ) O(n^2) O(n2),其中 1 ≤ n ≤ 1 0 6 1 ≤ n ≤ 10^6 1n106,可以拿到60分。

代码实现

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e6 + 5;
LL a[N], s[N];
int main()
{int n, k;cin >> n >> k;LL ans = 0;for(int i = 1; i <= n; i ++) { cin >> a[i]; s[i] = s[i - 1] + a[i];}for(int i = 1; i <= n; i ++){for(int j = 1; j <= i; j ++){LL x = s[i] - s[j - 1];if(x % k == 0) ans ++;}}cout << ans << endl;
}

算法优化

连续区间 [ L , R ] [L, R] [L,R]中所有数的和是 11 11 11的倍数,那么前缀和数组中 S [ R ] − S [ L − 1 ] S[R] - S[L - 1] S[R]S[L1]一定是 11 11 11的倍数,也就是说 ( S [ R ] − S [ L − 1 ] ) m o d 11 = 0 (S[R] - S[L - 1])\ mod\ 11=0 (S[R]S[L1]) mod 11=0。根据这个性质,不妨将前缀和数组中的每个值 m o d 11 mod\ 11 mod 11,得到一个余数数组,如下图所示。
在这里插入图片描述
如果存在两个位置 x x x y y y余数相同,它们相减的差为 0 0 0,那么说明序列中区间 [ x + 1 , y ] [x+1,y] [x+1,y]中所有数的和为 11 11 11的倍数。

这样,只需要统计一下,余数数组中值为 i i i的个数,不妨设有 c n t cnt cnt个,那么任意两个都可以构成一个区间,其中所有数为 11 11 11的倍数,那么对答案的贡献为: c n t × ( c n t − 1 ) / 2 cnt\times(cnt-1)/2 cnt×(cnt1)/2

时间复杂度

  • 处理前缀和的时间复杂度为 O ( n ) O(n) O(n)
  • 遍历所有余数的时间复杂度为 O ( k ) O(k) O(k)

总的时间复杂度为 O ( n + k ) O(n+k) O(n+k),其中 1 ≤ n ≤ 1 0 6 1 ≤ n ≤ 10^6 1n106 , 2 ≤ k ≤ 1 0 6 2 ≤ k ≤ 10^6 2k106

代码实现

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e6 + 5;
int a[N], s[N], cnt[N];
int main()
{int n, k;cin >> n >> k;cnt[0] = 1;for(int i = 1; i <= n; i ++){cin >> a[i];s[i] = (s[i - 1] + a[i]) % k;cnt[s[i]] ++;}LL ans = 0;for(int i = 0; i < k; i ++){if(cnt[i] > 1) ans += (LL) cnt[i] * (cnt[i] - 1) / 2; }cout << ans << endl;
}

http://www.ppmy.cn/ops/134293.html

相关文章

如果https连接的建立是通过cdn分为两段式的连接,而不是直接从源客户端到服务器端握手协商的连接,那么传输内容可信吗?cdn提供商不会作恶吗

在使用 CDN&#xff08;内容分发网络&#xff09;时&#xff0c;HTTPS 连接的确是分为两段式的&#xff0c;但这并不意味着传输内容不可信。以下是关于信任和安全性的几个关键点&#xff1a; 数据加密 端到端加密&#xff1a;在 CDN 代理的情况下&#xff0c;客户端与 CDN 之间…

F5 NGINX Controller 安全漏洞——Nginx版本升级到1.27.1

1. 查看当前版本 nginx -V 2. 备份配置文件 cp -r /etc/nginx /etc/nginx.bak 3. 更新包管理器 apt-get update 4. 下载 NGINX 1.27.1 源码或安装包 wget https://nginx.org/download/nginx-1.27.1.tar.gz 5. 解压并编译 NGINX 源码 tar -xzvf nginx-1.27.1.tar.gz cd…

哈佛商业评论 | 未来商业的技术趋势:百度李彦宏谈技术如何变革商业

在《哈佛商业评论》的HBR IdeaCast节目中&#xff0c;百度联合创始人、首席执行官兼董事长李彦宏分享了他对人工智能&#xff08;AI&#xff09;和其他技术趋势的见解。这期节目讨论了百度如何将生成式AI融入业务&#xff0c;以及这些技术如何重塑我们的生活和工作方式。让我们…

LlamaFactory介绍

目录 一、什么是LlamaFactory 1. 安装 LlamaFactory 2. 下载 LLaMA 模型 3. 运行 LLaMA 模型 4. 微调 LLaMA 模型 5. 优化本地运行 6. 推理加速 7. 硬件要求 二、总结 一、什么是LlamaFactory LlamaFactory 是一个用于训练和运行 LLaMA(Meta 的开源大型语言模型)模型…

远程控制步骤

当远在千里之外的朋友想求助你帮他找到他电脑上的文件、或者是给他安装软件时。但是你给他说了他又找不到&#xff0c;那么这时你就可以通过控制对方的电脑去做一系列的操作。 如何远程控制对方的电脑非常关键。 方法一&#xff08;Windows自带远程桌面功能&#xff09;&#…

Rust 语言学习笔记(三)

引用与解除引用 觉得还是有必要继续深入学习一下 Rust 再练手&#xff0c;毕竟仍然看到 & 和 * 符号还有些恍惚&#xff0c;大概就是 C/C 里的取地址和取值操作吧&#xff0c;实际上也确实类似。只是叫法略有不同, 还有就是在 C/C 多用了指针的概念。 在 C/C 中&#xff…

LeetCode654.最大二叉树

LeetCode刷题记录 文章目录 &#x1f4dc;题目描述&#x1f4a1;解题思路⌨C代码 &#x1f4dc;题目描述 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。 递归地在最大值 左边 的 子…

Docker在微服务架构中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 Docker在微服务架构中的应用 Docker在微服务架构中的应用 Docker在微服务架构中的应用 引言 Docker 基本概念 1. 容器 2. 镜像 3…