咋一看没切入点, 然后就崩了。
k 的大小决定了此题不能枚举。
转化成其他相同形式很关键!!
(n^2-n*m-m^2)^2 = ( -(m+n)^2 + 2n^2 + m*n)^2 = ((m+n)^2 - (n+m)*n + n^2)^2
发现 n 等价与 n + m
m 等价于 n
也就是斐波那契数列都满足于此式
而且m, n 为相邻的斐波那契数
所以找最接近k的两个就行了= =
观察和转化很重要!!!
代码如下
#include <cstdio>
#define max(a,b) a>b?a:b
int dp[1000001];
int main(){
int i, j, k;
scanf("%d", &k);
dp[0] = dp[1] = 1;
for(i = 2; i <= 1000001; i++){
dp[i] = dp[i-1] + dp[i-2];
if(dp[i] > k){
printf("m=%d\nn=%d\n", dp[i-2], dp[i-1]);
return 0;
}
}
return 0;
}
博客探讨了一道与极值问题相关的题目,指出不能通过枚举方法解决,关键在于将问题转化为斐波那契数列的形式。通过数学转化,找到相邻斐波那契数的关系,并说明找到最接近给定值k的两个斐波那契数即可解题,强调观察和转化在解题中的重要性。
3392

被折叠的 条评论
为什么被折叠?



