P16284 [蓝桥杯 2026 省 Python A 组] 音乐节拍器 题解
P16284 [蓝桥杯 2026 省 Python A 组] 音乐节拍器
Link: https://www.luogu.com.cn/problem/P16284
题目描述
小明在学习音乐,他发现不同乐器的演奏需要配合不同的节拍。现在有 N N N 种乐器,每种乐器都有自己的“节拍周期”(以秒为单位)。
在音乐演奏中,如果某一时刻恰好是某个乐器节拍周期的整数倍,那么这个乐器就会在这一时刻发声。例如,一个节拍周期为 3 3 3 秒的乐器会在第 3 3 3 秒、第 6 6 6 秒、第 9 9 9 秒等时刻发声。
小明想知道:在前 T T T 秒内(即第 1 1 1 秒至第 T T T 秒,包含第 T T T 秒),恰好有 K K K 种乐器同时发声的时刻有多少个?
输入格式
第一行包含三个整数 N , T , K N, T, K N,T,K,分别表示乐器数量、观察的时长、同时发声的乐器数量。
第二行包含 N N N 个整数 p 1 , p 2 , … , p N p_1, p_2, \dots, p_N p1,p2,…,pN,表示每种乐器的节拍周期(单位:秒)。
输出格式
一行,输出一个整数,表示恰好有 K K K 种乐器同时发声的时刻数量。
输入输出样例 #1
输入 #1
3 12 2
2 3 4
输出 #1
3
输入输出样例 #2
输入 #2
4 20 3
2 3 5 6
输出 #2
3
输入输出样例 #3
输入 #3
5 100 1
7 11 13 17 19
输出 #3
36
说明/提示
【样例说明 1】
乐器周期分别为 2 2 2、 3 3 3、 4 4 4 秒。在前 12 12 12 秒内,每个时刻发声情况如下表所示:
| 时刻 | 乐器 1(周期 2) | 乐器 2(周期 3) | 乐器 3(周期 4) | 发声乐器数 |
|---|---|---|---|---|
| 1 | - | - | - | 0 |
| 2 | ✓ | - | - | 1 |
| 3 | - | ✓ | - | 1 |
| 4 | ✓ | - | ✓ | 2 |
| 5 | - | - | - | 0 |
| 6 | ✓ | ✓ | - | 2 |
| 7 | - | - | - | 0 |
| 8 | ✓ | - | ✓ | 2 |
| 9 | - | ✓ | - | 1 |
| 10 | ✓ | - | - | 1 |
| 11 | - | - | - | 0 |
| 12 | ✓ | ✓ | ✓ | 3 |
表中“✓”表示该乐器在该时刻发声,“-”表示不发声。
恰好 2 2 2 种乐器同时发声的时刻有: t = 4 , 6 , 8 t = 4, 6, 8 t=4,6,8,共 3 3 3 个。
【样例说明 2】
乐器周期分别为 2 2 2、 3 3 3、 5 5 5、 6 6 6 秒。在前 20 20 20 秒内,恰好 3 3 3 种乐器同时发声的时刻如下表所示:
| 时刻 | 乐器 1(周期 2) | 乐器 2(周期 3) | 乐器 3(周期 5) | 乐器 4(周期 6) | 发声乐器数 |
|---|---|---|---|---|---|
| 6 | ✓ | ✓ | - | ✓ | 3 |
| 12 | ✓ | ✓ | - | ✓ | 3 |
| 18 | ✓ | ✓ | - | ✓ | 3 |
说明:乐器 1 1 1、 2 2 2、 4 4 4 的最小公倍数为 6 6 6,所以在时刻 6 , 12 , 18 6, 12, 18 6,12,18 这三个乐器会同时发声。乐器 3 3 3(周期 5 5 5)在这些时刻不发声,因此恰好 3 3 3 种乐器。
【评测用例规模与约定】
对于 30 % 30\% 30% 的评测用例, N ≤ 5 N \leq 5 N≤5, T ≤ 100 T \leq 100 T≤100;
对于 60 % 60\% 60% 的评测用例, N ≤ 10 N \leq 10 N≤10, T ≤ 1000 T \leq 1000 T≤1000;
对于所有评测用例, 1 ≤ N ≤ 20 1 \leq N \leq 20 1≤N≤20, 1 ≤ T ≤ 10000 1 \leq T \leq 10000 1≤T≤10000, 1 ≤ K ≤ N 1 \leq K \leq N 1≤K≤N, 1 ≤ p i ≤ 100 1 \leq p_i \leq 100 1≤pi≤100。
Solution
1. 题意
已知每种乐器的发声间隔,求一段时间 1 ∼ T 1\sim T 1∼T 内恰好有 K K K 种乐器发声的次数。
2. 分析
非常基础的模拟问题。
对于每一个 1 ∼ T 1\sim T 1∼T 的时刻 t t t,依次用每一个 p i p_i pi 判断当前的 t t t 能否被其整除,累加得到这个时刻同时发声的乐器数量,判断是否等于 K K K 即可。
重复 T T T 次就得到了 1 ∼ T 1\sim T 1∼T 期间,同时演奏的乐器数恰好等于 K K K 的次数。
总体的时间复杂度是 O ( N T ) O(NT) O(NT)。
3. 代码
using System;
class P16284
{
static void Main()
{
var input = Console.ReadLine()?.Split();
if (input == null || input.Length < 3) return;
int N = Convert.ToInt32(input[0]);
int T = Convert.ToInt32(input[1]);
int K = Convert.ToInt32(input[2]);
var pInput = Console.ReadLine()?.Split();
int[] p = new int[N];
for (int i = 0; i < N; i++)
{
p[i] = Convert.ToInt32(pInput[i]);
}
int ans = 0;
for (int t = 1; t <= T; t++)
{
int cnt = 0;
for (int i = 0; i < N; i++)
{
if (t % p[i] == 0)
{
cnt++;
}
}
if (cnt == K)
{
ans++;
}
}
Console.WriteLine(ans);
}
}
闲话
输入的都是整数,意味着所有的声音都要间隔至少 1 秒才能触发,也就意味着本题的“音乐”的 BPM 最大只有 60。
更多推荐

所有评论(0)