题目解析
* 输入输出:第一行输入整数 nnn,接下来 nnn 行每行一个正整数 aia_iai ;对每个 aia_iai 判断是否能表示为两个正整数的平方和,能则输出 Yes,否则输出 No。
* 数据范围:根据 GESP 二级难度,通常 n≤100n \leq 100n≤100,ai≤104a_i \leq 10^4ai ≤104 左右(具体未明示,但双重循环可过)。
* 复杂度要求:当前解法时间复杂度 O(n⋅ai)O(n \cdot a_i)O(n⋅ai ),空间复杂度 O(1)O(1)O(1)。
* 算法知识点:暴力枚举、完全平方数、数学
思路解析
1. 数学建模:对于每个查询值 xxx,需判定是否存在正整数对 (i,j)(i, j)(i,j) 满足 i2+j2=xi^2 + j^2 = xi2+j2=x。注意 i,j≥1i, j \geq 1i,j≥1(区别于非负整数)。
2. 枚举范围确定:由于 i2≤xi^2 \leq xi2≤x 且 j2≤xj^2 \leq xj2≤x,可知 i,j∈[1,x]i, j \in [1, \sqrt{x}]i,j∈[1,x ]。
3. 双重循环验证:外层枚举 iii,内层枚举 jjj,计算平方和。一旦发现 i2+j2=xi^2 + j^2 = xi2+j2=x 立即返回 true;若全部枚举完毕未找到,返回 false。
4. 关键细节:循环条件使用 pow(i, 2) <= x 控制上限,也可写作 i * i <= x(后者避免浮点精度风险)。
完整代码