vijosP1543 极值问题
链接:https://vijos.org/p/1543
【题解】(网上)
从简单情况人手:
设定m=1,将m代人方程②有(n2-n-1)2=1,可求出n=1;
m=2,代人②,有(n2-2n-4)2=1,可求出n=3;
m=3,代人②,有(n2-3n-9)2=1,可求出n=5;
m=4,代人②,有(n2-4n-16)2=1,可知无整数解;
m=5,代人②,有(n2-5n-25)2=1,可求出n=8;
将满足条件的m,n排列在一起,有:1 2 3 5 8…
看到上述数列,熟悉Fibonacci数列的应该有些面熟,于是就可以猜测,m,n是否为Fibonacci数列中相邻的两项,提出这样的猜想之后,就可以再次设定m=8,可求出n正好等于13,可见猜想成立。提出猜想之后,就应该想办法证明这一猜想。事实上,对条件②的等式进行一些数学变换:
(n2-mn-m2)2=[-(n+m)2+2n2+mn]2=[(n+m)2-n(n+m)-n2]2 =[(n')2-m'n'-(m')2]2
其中:n'=m+n,m'=n
由上述数学变换可以得出,若m和n为满足条件的一组解,则m'和n'也是满足条件的一组解。通过上述证明可知,m,n的确是满足Fibonacci数列的相邻两项,即猜想得以证明。再加上题设中要求使得m2+n2的值最大的条件,可知问题的解即为Fibonacci数列中小于k的最大两个相邻数。
由此可见,上述例题的求解方法正是归纳策略一般所要求的三个步骤:从简单情况人手、寻找规律、提出猜想和验证猜想。
【代码】
1 #include<iostream> 2 using namespace std; 3 4 int main() { 5 long long k,f1,f2,f3,tmp,ans; 6 cin>>k; 7 f1=1; f2=1; f3=2; 8 while(f3<=k) { 9 tmp=f2+f3; 10 f1=f2; f2=f3; 11 f3=tmp; 12 } 13 cout<<(long long)(f2*f2+f1*f1); 14 return 0; 15 }