luogu P1775 古代人的难题_NOI导刊2010提高(02)(斐波纳契+数学)

题意

已知x,y为整数,且满足以下两个条件:

1.x,y∈[1…k],且x,y,k∈Z

2.(x^2-xy-y^2)^2=1

给你一个整数k,求一组满足上述条件的x,y并且使得x^2+y^2的值最大。

k<=1018

题解

这题需要推式子

(x2-xy-y2)2=1

(y2+xy-x2)2=1

[(x+y)2-xy-2x2)]2=1

[(x+y)2-(x+y)x-x2)]2=1

然后因为斐波那契数列有一个性质:

把f[n+1]变成f[n]+f[n-1]这个式子就变成了:

f[n]2-f[n]f[n-1]-f[n-1]2=(-1)n-1

发现这两个式子很像

仔细观察我们发现,当x+y=f[n],x=f[n-1]时式子成立

令x1=x+y;y1=x;

(x12-x1y1-y12)2=1即当x1=f[n],y1=f[n-1]时式子成立

我们要求x2+y2的最大值。

就是求f[n]2+f[n-1]2的最大值。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 unsigned long long n,f[2000000];
 8 int now;
 9 int main(){
10     scanf("%llu",&n);
11     now=2; 
12     f[0]=0;f[1]=1;f[2]=1;
13     while(n>=f[now]){
14         now++;
15         f[now]=f[now-1]+f[now-2];
16     }
17     printf("%llu %llu",f[now-1],f[now-2]);
18     return 0; 
19 }

猜你喜欢

转载自www.cnblogs.com/Xu-daxia/p/9563991.html