1 条题解
-
0
📝 题目大意
给定两个整数 和 (),判断是否存在一对正整数 ,使得 且 。
💡 解题思路
-
题目分析:问题等价于:是否存在两个正整数,它们的和为 ,积为 。从代数角度看, 和 是方程 的两根,但这道题不需要解二次方程,直接利用因式分解关系即可。
-
算法推导:
- 若存在满足条件的 ,则 和 必然是 的两个因子(因为 )。
- 因此,只需枚举 的所有因子。设 为 的一个因子,则另一个因子为 。检查 是否成立即可。
- 枚举时只需遍历 从 到 (因为因子成对出现, 意味着 或 )。对于每个 ,若 ,则检查 是否等于 。
- 该做法与 std.cpp 完全一致:用
s存储 ,用d存储 ,循环for(int i=1;i*i<=d;i++)枚举因子,判断i + d/i == s。
-
边界与细节:
- 数据类型: 最大可达 ,
i + d/i的结果也在long long范围内,但使用 32 位int会溢出。std.cpp 使用#define int long long将int提升为 64 位,避免溢出。 - 循环上限:,循环次数最多 ,完全在时限内。
- 正整数约束: 从 开始枚举, 也是正整数,自然满足 为正整数的要求。
- 特殊数据:当 时,,,输出
Yes()。当 时,,输出No。
- 数据类型: 最大可达 ,
⏱️ 复杂度分析
- 时间复杂度:。枚举 到 的所有整数,每次检查 和加法均为 。最坏情况下 ,约 次迭代,完全可行。
- 空间复杂度:。仅使用常数个变量 ,无需额外数组。
💻 标准代码 (C++)
#include<bits/stdc++.h> #define int long long // 将 int 提升为 long long,防止 10^12 范围内溢出 using namespace std; int s, d, T = 1; // s 对应 S,d 对应 P,T 为测试用例数(固定为 1) signed main() { while (T--) { cin >> s >> d; // 枚举 P 的所有因子,只需遍历到 sqrt(P) for (int i = 1; i * i <= d; i++) { if (d % i == 0) { // i 是 d 的一个因子 if (i + d / i == s) { // 检查因子对之和是否等于 S cout << "Yes"; return 0; } } } cout << "No"; } return 0; } -
- 1
信息
- ID
- 852
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者