vijosP1543 极值问题

vijosP1543 极值问题

链接:https://vijos.org/p/1543

【题解】(网上)

 从简单情况人手:
    
设定m1,将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
    
将满足条件的mn排列在一起,有:1 2 3 5 8…
    
看到上述数列,熟悉Fibonacci数列的应该有些面熟,于是就可以猜测,mn是否为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+nm'=n
    
由上述数学变换可以得出,若mn为满足条件的一组解,则m'n'也是满足条件的一组解。通过上述证明可知,mn的确是满足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 }
原文地址:https://www.cnblogs.com/lidaxin/p/4872883.html