1103 缘分数
所谓缘分数是指这样一对正整数 a 和 b,其中 a 和它的小弟 a−1 的立方差正好是另一个整数 c 的平方,而 c 正好是 b 和它的小弟 b−1 的平方和。例如 8 3 − 7 3 = 169 = 1 3 2 8^3 −7^3 =169=13^2 83−73=169=132 ,而 13 = 3 2 + 2 2 13=3^2 +2^2 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、b、c他们满足公式 a 3 − ( a − 1 ) 3 = c = ( b 2 + ( b − 1 ) 2 ) 2 a^3-(a-1)^3 = c =( b^2+(b-1)^2)^2 a3−(a−1)3=c=(b2+(b−1)2)2,这里的 c c c的作用就是强调是一个整数。
在编程求解中有一个比较大的误区就是,
b
b
b的值需要循环(当然不排除有人也可能审题不仔细以为
b
b
b和
a
a
a都是在范围[m,n]内),其实并不需要。
用题目中的例子来说
8
3
−
7
3
=
169
=
1
3
2
8^3 −7^3 =169=13^2
83−73=169=132,它里面
1
3
2
13^2
132和
13
=
3
2
+
2
2
13=3^2 +2^2
13=32+22的关系是什么呢?
为了更清晰一些,这里列一个不等式看一下:
3
2
+
2
2
=
13
<
3
2
+
3
2
3^2 + 2^2 = 13 <3^2+3^2
32+22=13<32+32
显然是
169
(
=
1
3
2
)
169(=13^2)
169(=132)开平方后得到
13
13
13,再除
2
2
2得到
6.5
6.5
6.5,这个
6.5
6.5
6.5一定是介于
2
2
2和
3
3
3中间的值,如果牵扯到代码里面就是用cmath
库里面的sqrt
函数向下取整之后
+
1
+1
+1即可得到
b
b
b对应的值,也就是
3
3
3。
此外,就是找不到结果的一种情况,说白了a和b不能相同的前提下,也没有满足公式
a
3
−
(
a
−
1
)
3
=
c
=
(
b
2
+
(
b
−
1
)
2
)
2
a^3-(a-1)^3 = c =( b^2+(b-1)^2)^2
a3−(a−1)3=c=(b2+(b−1)2)2的情况发生,就输出No Solution
,注意大小写。
AC例程
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int left, right, sqr, b, error = 1;
cin >> left >> right;
for(int a = left; a <= right; ++a)
{
sqr = (int)sqrt(pow(a,3)-pow(a-1,3));
b = sqrt(sqr/2)+1;
{
if(pow(a,3)-pow(a-1,3) == pow(pow(b,2)+pow(b-1,2),2)
&& a != b)
{
cout << a << ' ' << b <<endl;
error = 0;
}
}
}
if(error)
cout << "No Solution" << endl;
return 0;
}