2024年CSP-X复赛真题题解(T2:消灭怪兽)

题目描述

怪兽入侵了地球!

为了抵抗入侵,人类设计出了按顺序排列好的 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
输入 #1
5 3
1 2 3 4 5
输出 #1
7
输入输出样例 #2
输入 #2
10 11
1 4 8 10 16 19 21 25 30 43
输出 #2
7
输入输出样例 #3
输入 #3
6 2
2 2 2 2 2 2
输出 #3
21
说明/提示
样例解释

样例 1 1 1 解释:

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

数据范围

对于 20 % 20\% 20% 的数据,满足 1 ≤ n , k ≤ 100 1 \leq n,k \leq 100 1n,k100

对于 40 % 40\% 40% 的数据,满足 1 ≤ n , k ≤ 1 0 4 , 1 ≤ a i ≤ k 1 \leq n,k \leq 10^4,1 \leq a_i \leq k 1n,k104,1aik

对于另外 10 % 10\% 10% 的数据,满足 k = 2 k=2 k=2

对于另外 10 % 10\% 10% 的数据,满足所有的 a i a_i ai 均相等。

对于 100 % 100\% 100% 的数据,满足 1 ≤ n ≤ 1 0 6 , 2 ≤ k ≤ 1 0 6 , 1 ≤ a i ≤ 1 0 9 1 \leq n \leq 10^6,2 \leq k \leq 10^6,1 \leq a_i \leq 10^9 1n106,2k106,1ai109

AC代码:
#include<bits/stdc++.h>
  using namespace std;
  const int N = 1e6 + 10;
  long long n, k, a[N], sum[N], cnt[N], ans;
  int main() {
  cin >> n >> k;
  // 初始化:前缀和为0(即没有选择任何元素时)模k余数为0,出现1次
  // 这表示从第一个元素开始的区间也可以被统计到
  cnt[0] = 1;
  for(int i = 1; i <= n; i++) {
  cin >> a[i];
  // 计算前缀和:sum[i] = a[1] + a[2] + ... + a[i]
  sum[i] = sum[i - 1] + a[i];
  // 计算前缀和模k的余数
  long long r = sum[i] % k;
  // 关键步骤:如果之前有cnt[r]个前缀和与当前前缀和模k同余,
  // 那么这些位置到当前位置的区间和都是k的倍数
  // 因为 sum[j] - sum[i] ≡ 0 (mod k)
  ans += cnt[r];
  // 更新余数r的出现次数
  cnt[r]++;
  }
  cout << ans;
  return 0;
  }
核心思路:
  1. 计算前缀和数组 sum[i] 表示前i个元素的和
  2. 利用同余定理:如果两个前缀和 sum[i]sum[j] 模k的余数相同,那么区间 [i+1, j] 的和就是k的倍数
  3. 使用计数数组 cnt 记录每个余数出现的次数
  4. 对于每个位置,查看之前有多少个前缀和与当前前缀和模k同余,这些对应的区间都是满足条件的

文末福利:

csp信奥赛复赛12大高频考点专题集训,助力你冲刺csp一等奖
在这里插入图片描述

课程直通链接:

https://edu.csdn.net/course/detail/40437

csp信奥赛复赛集训课涵盖12大高频考点专题集训内容:

1、语法基础专题
2、数学思维专题
3、模拟算法专题
4、排序算法专题
5、贪心算法专题
6、二分算法专题
7、前缀和&差分
8、深度优先搜索
9、广度优先搜索
10、动态规划专题
11、栈和队列专题
12、树和图专题

posted on 2025-10-11 14:22  ycfenxi  阅读(5)  评论(0)    收藏  举报