极值问题
时间限制: 1 Sec 内存限制: 128 MB题目描述
已知m、n为整数,且满足下列两个条件:
① m、n∈1,2,…,K,(1≤K≤10^9)
② (n^ 2-mn-m^2)^2=1
编一程序,对给定K,求一组满足上述两个条件的m、n,并且使m^2+n^2的值最大。例如,若K=1995,则m=987,n=1597,则m、n满足条件,且可使m^2+n^2的值最大。
输入
输入仅一行,K的值。
输出
输出仅一行,m^2+n^2的值
样例输入
1995
样例输出
3524578
解题思路:一看到这题我就蒙了,看了看大神的代码,晕~~!!!斐波那契数列。我们先带入几个值试一下
带入m=1时,解出n=1;
带入m=2时,解出n=3;
带入m=3时,解出n=5;
带入m=4时,无解;
带入 m=5时,解出n=8;
1 1 2 3 5 8,是不是很像斐波那契数列,没错就是。
看来做题时尝试一下或许有意外的收获;
代码如下:
# include<stdio.h>
long long f[10005];
int main(){
int n;
scanf("%d",&n);
f[1]=1;
f[0]=1;
f[2]=2;
int i;
if(n<=1) {
printf("2\n");
}
else
for(i=3;;i++) //两种可能的情况
{
f[i]=f[i-1]+f[i-2];
if(f[i]>n) //注意
{
printf("%lld\n",f[i-1]*f[i-1]+f[i-2]*f[i-2]);
break;
}
else if(f[i]==n) //注意
{
printf("%lld\n",f[i]*f[i]+f[i-1]*f[i-1]);
break;
}
}
return 0;
}