1 条题解
-
0
A. Dinner Time 题解
题目分析
给定四个整数 ,我们需要判断是否存在一个整数数组 ,满足:
- 所有元素之和等于 :
- 每 个连续元素之和等于 :,对所有
元素可以是负数,这给了我们很大的构造空间。
数学推导
1. 周期性
考虑相邻的两个条件:
对于 和 ,有:
两式相减得:
$$(a_{i+1} + \cdots + a_{i+p-1} + a_{i+p}) - (a_i + a_{i+1} + \cdots + a_{i+p-1}) = 0 $$因此:
这个等式对所有 成立。这意味着数组是周期为 的周期序列:
2. 周期表示
设周期内的 个元素为 ,其中 。那么整个数组可以表示为:
周期内元素满足:
3. 总和计算
数组长度 可以写成:
其中 是完整周期数, 是剩余元素个数()。
那么数组的总和为:
$$\sum_{i=1}^n a_i = k \cdot \sum_{j=1}^p b_j + \sum_{j=1}^r b_j = k \cdot q + S_r $$其中 是周期中前 个元素的和。
4. 可行性分析
我们需要判断是否存在整数 满足:
即:
现在问题转化为:是否存在长度为 、和为 的整数序列,其前 项和为某个给定值 ?
5. 分类讨论
情况 1:(即 能被 整除)
此时 ,所以条件变为:
因为 ,所以需要 。
结论:当 时,有解当且仅当 。
情况 2:(即 不能被 整除)
此时 。我们需要证明:对任意整数 ,都可以构造出满足条件的序列。
构造方法如下:
- 令 ,
- 则前 项和为
- 剩余 项需要和为
- 令 ,
由于 ,这种构造总是可行的。因此,当 时,对任意 都存在解。
最终结论
根据以上推导,判断条件如下:
- 如果 ,则需要
- 如果 ,则总是有解(输出
"YES")
算法实现
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t; while (t--) { int n, m, p, q; cin >> n >> m >> p >> q; if (n % p == 0 && (n / p) * q != m) { cout << "NO\n"; } else { cout << "YES\n"; } } return 0; }
复杂度分析
- 时间复杂度:,每个测试用例
- 空间复杂度:
示例验证
以题目给出的示例进行验证:
条件判断 结果 3 2 1 1 ≠ 0 总是 YES YES 1 0, YES 5 4 2 3 1 ≠ 0 总是 YES 10 7 5 2 0, NO 4 1 3 0, 与题目输出完全一致 ✓
总结
本题的关键在于发现数组的周期性性质:由每 个连续元素和相等可推出 。利用这一性质,将问题转化为判断周期序列能否满足总和条件,最终得到简洁的判断公式。
- 1
信息
- ID
- 6183
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者