所谓缘分数是指这样一对正整数 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
这个题目埋了一个大坑,“其中 a 和它的小弟 a−1 的立方差正好是另一个整数 c 的平方”,隐含了一个条件,a和c是不相等的。看了一下其他博主的代码,好多是误打误撞过的。
最后一个测试点 是 1 1,输出 No Solution
#include<cstdio>
#include<set>
#include<map>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int a,b;
int flag=1;
cin>>a>>b;
for(int i=a;i<=b;i++){
int result = pow(i,3)-pow(i-1,3);
int c = sqrt(result);
if(c*c == result){
//这里是想优化查找 因为 c = b^2 + (b-1)^2 ,所以b肯定小于等于c的开根号结果 题目又说了b是正整数 所以b >= 1
//如果不优化 直接在循环中 写 j<=c即可 写 j<c 可以通过最后一个测试点,但是并不合理,属于误打误撞
int n = sqrt(c);
//从 1 到 n 查找 j 和 j-1也可以
for(int j=0;j<=n;j++){
if(pow(j,2)+pow(j+1,2) == c){
//针对题干隐藏条件 单独加一个判断
if(i!=j+1){
flag = 0;
cout<<i<<" "<<j+1<<endl;
}
}
}
}
}
if(flag)
cout<<"No Solution"<<endl;
return 0;
}