1 条题解
-
0
自动搬运
来自洛谷,原作者为

lzy20091001
花开堪折直须折,莫待无花空折枝。搬运于
2025-08-24 22:57:33,当前版本为作者最后更新于2024-05-02 21:07:14,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
分析
编号为 的图显然满足题意。
在编号为 的图中,每一个点都只会连出一条边,而编号为 的点总是和自己连边,这意味着有效的边至多有 条。而这张图要求连通,那么这张图一定是一棵树, 条边都是有效的,具体地,没有重边和环。
我们指定 是 的父亲,那么这棵树就会呈现以编号为 的点为根的形态。这是因为除编号为 的点都没有自环,向父亲回溯时只有走到编号为 的点才会停止。在这个形态下观察这棵树,指定根结点 在第 层,则对于第 层的点 ,有 。
因此问题转化为对于 ,有哪些 满足对于任意 都可以找到一个最小的 使得 。
结论是当且仅当 是 质因数的乘积的倍数时满足要求。下面给出证明。
由唯一分解定理,设 (其中 为质数),记 ,不妨设 。
- 必要性:一定存在 且 (如 )。若 ,则 有 所没有的质因子,所以 总不成立。
- 充分性: 时, 时显然满足,不断枚举 直到 不成立即可找到最小的 。
中有 个整数是 的倍数,再加上编号为 的图,所以最终的答案即为 ,其中 为 所有质因数的乘积。
将 分解质因数的方法可以参考 OI Wiki,本题中 的朴素方法即可通过,这样最终的时间复杂度为 。
实现
#include <iostream> long long f(long long n) // n 所有质因数的乘积 { long long res = 1; for (int i = 2; 1ll * i * i <= n; i++) { if (n % i == 0) res *= i; while (n % i == 0) n /= i; } if (n != 1) res *= n; return res; } int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); std::cout.tie(nullptr); int t; std::cin >> t; while (t--) { long long n, m; std::cin >> n >> m; std::cout << m / f(n) + 1 << "\n"; } return 0; }
- 1
信息
- ID
- 8224
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 4
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者