PAT乙级1103 缘份数
题目:
所谓缘分数是指这样一对正整数 a 和 b,其中 a 和它的小弟 a−1 的立方差正好是另一个整数 c 的平方,而 c 正好是 b 和它的小弟 b−1 的平方和。例如 83−73=169=132,而 13=32+22,于是 8 和 3 就是一对缘分数。
给定 a 所在的区间 [m,n],是否存在缘分数?
输入格式:
输入给出区间的两个端点 0<m<n≤25000,其间以空格分隔。
输出格式:
按照 a 从小到大的顺序,每行输出一对缘分数,数字间以空格分隔。如果无解,则输出 No Solution。
输入样例 1:
8 200
输出样例 1:
8 3 105 10
输入样例 2:
9 100
输出样例 2:
No Solution
分析:
1、一对正整数a b构成缘分数,也就是a != b,所以a = b = 1虽然满足定义,但也不是缘份数。
2、计算出来a a-1的立方差,先判断该立方差是否是另一个数c的平方再去搜索b,效率更高。
3、搜索b的时候可以只搜索到c,因为b2 + (b-1)2 <= c2。
代码:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int m, n;
cin >> m >> n;
bool find = false;
for(int a = m; a <= n; a++)
{
long long a3 = pow(a, 3) - pow(a - 1, 3);
long long c = sqrt(a3);
if(c * c == a3) //判断是否正整数平方
{
for(int b = 2; b < c; b++) //搜索下限2 上限c
{
long long b2 = pow(b, 2) + pow(b - 1, 2);
if(c == b2)
{
find = true;
cout << a << " " << b << endl;
}
}
}
}
if(!find) cout << "No Solution" << endl;
return 0;
}
#刷题记录#PAT乙级 文章被收录于专栏
PAT乙级(Basic)刷题记录


查看29道真题和解析