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 }