极值
已知m、n为整数,且满足下列两个条件:
① m、n∈{1,2,…,k},即1≤m,n≤k
②(n2-m*n-m2)2=1
你的任务是:编程由键盘输入正整数k(1≤k≤109),求一组满足上述两个条件的m、n,并且使m2+n2的值最大。例如,从键盘输入k=1995,则输出:m=987 n=1597。
今天咋遇到这么多奇怪题...
先数学推导一波,发现m + n,n也能满足上式,因此答案就是一个斐波那契数列,求出<=k的最大的相邻两项即可
复杂度O(logk)
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cstdlib> #include<ctime> using namespace std; inline int read() { int ans = 0,op = 1; char ch = getchar(); while(ch < '0' || ch > '9') { if(ch == '-') op = -1; ch = getchar(); } while(ch >= '0' && ch <= '9') { (ans *= 10) += ch - '0'; ch = getchar(); } return ans * op; } typedef int mainint; #define int long long int a,b,c,k; mainint main() { k = read(); a = b = 1; c = a + b; while(c < k) a = b,b = c,c = a + b; cout << "m=" << a << endl << "n=" << b; }