8 条题解
-
3
Ilumina 题解
30 分解法
的部分分。
已知 ,,并且 和 的值已经给定。我们将 代入 中,得到下列式子。
$$c = \left \lfloor \dfrac{\left \lfloor \dfrac{a}{n} \right \rfloor}{m} \right \rfloor $$因为 均为正整数,并且 和 在 和 中均为分母,因此只有当 且 时, 和 才为正整数。
枚举 中的整数 和 $\left[1, \left \lfloor \dfrac{a}{n} \right \rfloor \right]$ 中的整数 ,并判断是否有满足 $\left \lfloor \dfrac{\left \lfloor \dfrac{a}{n} \right \rfloor}{m} \right \rfloor = c$ 的 和 即可。
60 分解法
的部分分。
使用 表示 的小数部分,显然 ,因此下列式子中 的值不可能改变式子的取值。
$$\left \lfloor \dfrac{a}{nm} \right \rfloor = \left \lfloor \dfrac{\dfrac{a}{n}}{m} \right \rfloor = \left \lfloor \dfrac{\left \lfloor \dfrac{a}{n} \right \rfloor + \left \{ \dfrac{a}{n} \right \} }{m} \right \rfloor = \left \lfloor \dfrac{\left \lfloor \dfrac{a}{n} \right \rfloor}{m} \right \rfloor $$所以 。因为 和 可以为任意正整数,我们令 ,此时 ,。枚举 即可。
80 分解法
和特殊性质的部分分。
对于特殊性质,因为合法的 始终存在,可以发现有如下等式成立。
$$c = \left \lfloor \dfrac{\left \lfloor \dfrac{a}{n} \right \rfloor}{m} \right \rfloor = \left \lfloor \dfrac{b}{m} \right \rfloor $$可以为任意正整数,因此我们令 ,即可得到 。直接输出 的值即可。
正解
由 60 分解法可以发现,问题转化成了判断是否存在正整数 使得 。
如果存在这样的 ,由于构造中 ,直接输出 即可。
$$\left \lfloor \dfrac{a}{\left \lfloor \dfrac{a}{c} \right \rfloor} \right \rfloor \ge \left \lfloor \dfrac{a}{\dfrac{a}{c}} \right \rfloor = \left \lfloor c \right \rfloor = c = \left \lfloor \dfrac{a}{m} \right \rfloor $$存在合法的 当且仅当存在区间 满足 且对于 有 。
很显然,最大的满足条件的 (使用 表示)满足 且 ,容易得到 ,计算 的值并且检验 是否等于 即可判断是否存在合法的 。
单组数据时间复杂度 。
#include <iostream> using namespace std; using ll = long long; int t; ll a, c; int main() { cin.tie(nullptr); ios::sync_with_stdio(false); for (cin >> t; t; --t) { cin >> a >> c; if (a < c) cout << "-1\n"; else cout << (a / (a / c) == c ? a : -1) << '\n'; } return 0; }
可能的其他解法
由 60 分解法可以得到 具有单调性,因此可以对 进行二分查找。单组数据时间复杂度 。
信息
- ID
- 14
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 2
- 标签
- 递交数
- 804
- 已通过
- 221
- 上传者