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 1≤n,k≤100。
对于 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 1≤n,k≤104,1≤ai≤k。
对于另外 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 1≤n≤106,2≤k≤106,1≤ai≤109。
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;
}
核心思路:
- 计算前缀和数组
sum[i]表示前i个元素的和 - 利用同余定理:如果两个前缀和
sum[i]和sum[j]模k的余数相同,那么区间[i+1, j]的和就是k的倍数 - 使用计数数组
cnt记录每个余数出现的次数 - 对于每个位置,查看之前有多少个前缀和与当前前缀和模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、树和图专题
浙公网安备 33010602011771号