学校春季测试——魔法

题目描述

找两个数\(m\),\(n\),这两个数符合以下三条原则:

  1. \(m,n \in \{1,2,\cdots ,k\}\)
  2. \(|n^2-m\times n-m^2|=1\)
  3. \(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;
}

完成!

posted @ 2024-02-22 15:50  Pinecone_0v0  阅读(60)  评论(0)    收藏  举报