luogu1775 古代人的难题 打表找规律
题目大意:给出一正整数k,求满足(x^2-x*y-y^2)^2=1且x,y∈[1,k]且x^2+y^2最大的正整数x,y。
既然x,y的范围给出来了,我们便有了暴力解法。因此,本题最适合打表找规律了!
打表代码:
#include <cstdio> using namespace std; int main() { printf("k\tx\ty\n"); for (long long k = 1; k <= 100; k++) { long long ansX = 0, ansY = 0; for (long long x = k; x >= 1; x--) { for (long long y = k; y >= 1; y--) { long long t = x * x - x * y - y * y; if ((t == 1 || t == -1) && x*x + y*y > ansX*ansY) { ansX = x; ansY = y; } } } printf("%lld\t%lld\t%lld\n", k, ansX, ansY); } return 0; }
一运行,发现x就是小于等于k的最大斐波那契数,y就是小于等于k的第二大斐波那契数。于是求即可。
AC代码:
#include <cstdio> using namespace std; #define ll long long int main() { ll k; scanf("%lld", &k); ll f[3]; f[0] = f[1] = 1; ll i = 1; while (f[i % 3] < k) { i++; f[i % 3] = f[(i - 1) % 3] + f[(i - 2) % 3]; } printf("%lld %lld\n", f[(i - 1) % 3], f[(i - 2) % 3]); return 0; }
正确解释:(x^2 - xy - y^2)^2 = (y^2+ xy - x^2)^2 =[(x+y)^2-xy-2*x^2]^2 =[(x+y)^2-(x+y)*x-x^2]^2。把x换成x+y,y换成x就知道这是个斐波那契数了。