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)刷题记录