学校春季测试——魔法
题目描述
找两个数\(m\),\(n\),这两个数符合以下三条原则:
- \(m,n \in \{1,2,\cdots ,k\}\);
- \(|n^2-m\times n-m^2|=1\);
- \(m,n\) 为整数。
王二小需要找出 \(m\) 和 \(n\)分别为多少的时候 \(m^2+n^2\) 取得最大值。请输出\(m\)和\(n\)。
思路
刚拿到题,一头雾水,后来用代码打了个表:
代码
for(int n=1;n<=Max;++n){
for(int m=1;m<=Max;++m){
if(abs(n * n - m * n - m * m) == 1)
cout << "m=" << m << " n=" << n << "\n";
输出
m=1 n=1
m=1 n=2
m=2 n=3
m=3 n=5
m=5 n=8
m=8 n=13
m=13 n=21
m=21 n=34
m=34 n=55
m=55 n=89
m=89 n=144
m=144 n=233
m=233 n=377
m=377 n=610
m=610 n=987
m=987 n=1597
m=1597 n=2584
m=2584 n=4181
m=4181 n=6765
通过观察,唉?这不是斐波那契数列吗?
太对了!!!!
这道题就是要用斐波那契数列解决。
通过观察,\(m < n\)的情况下,\(n\) 是 \(m\) 的下一个数(在斐波那契数列中)。而 \(m\) 是上一组的 \(n\) 。
代码就这样推出来力(喜)
最后附上:
AC代码
#include <iostream>
using namespace std;
const int maxk = 1e8+99;
int k;
int N[maxk];
int M[maxk];
int i,cntn,cntm;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> k;
N[1] = 1;
M[1] = 1;
for(i = 2;N[i-1] <= k;++i){
N[i] = N[i-1] + M[i-1];
M[i] = N[i-1];
}
cout << "m=" << M[i-2] << "\n";
cout << "n=" << N[i-2] << "\n";
return 0;
}
浙公网安备 33010602011771号