P1334 powermax
时间: 1000ms / 空间: 131072KiB / Java类名: Main
描述
对于一个整数K,有很多组数对(M,N)满足如下两个性质:
1.1<=M<=N<=K
2.(N^2-MN-M^2)^2=1
求一对(M,N)使M^2+N^2最大.
1.1<=M<=N<=K
2.(N^2-MN-M^2)^2=1
求一对(M,N)使M^2+N^2最大.
输入格式
一个整数K
输出格式
两个整数M,N
测试样例1
输入
1995
输出
987 1597
备注
时限0.5s
1<=k<=10^9
一道经典题
1<=k<=10^9
一道经典题
我们对 [n^2-nm-m^2]做一下变换,发现它等于
[(n+m)^2-(n+m)*n-n^2]
又n>=m,我们不妨将n看做某个数列第k+1项,m看做某个数列第k项,设这个数列为Fn,则上式为
[(Fk+1+Fk)^2-Fk+1*Fk-Fk+1^2] 是不是很熟悉,对就是斐波那契数列,代入后发现完美符合,所以至此此题就结束了。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn = 100000 + 10;
int k;
int f[maxn];
int main()
{
scanf("%d",&k);
f[1] = f[2] = 1; int now = 2;
while(f[now - 1] + f[now] <= k){
++now; f[now] = f[now - 1] + f[now - 2];
}
cout<<f[now - 1]<<" "<<f[now]<<endl;
return 0;
}