题目背景
《爱与愁的故事第五弹·Halloween》第二章。
题目容易吐血请谨慎阅读!
题目描述
爱与愁大神兴高采烈地踏出妖精系道馆——他已经获得了妖精系徽章(鼓掌)!可是一出门就遇到一群パンプジン(Because today is Halloween)!仲谋半?没事,爱与愁大神手上还仅存着一只水晶灯火灵(完克パンプジン)。或许是因为这是爱与愁大神存活的最后一只精灵,水晶灯火灵十分振奋,一击打垮了一群パンプジン。水晶灯火灵使用了一招***(被打上了马赛克?!),刚好符合以下③条规则:
①m,n∈{1,2,⋯ ,k}m,n \in {1,2,\cdots ,k}m,n∈{1,2,⋯,k}
②(n2−m×n−m2)2=1(n^2-m\times n-m2)2=1(n2−m×n−m2)2=1
③m,nm,nm,n为整数。
Ai Yuchou God was very happy,he wants to know m²+n² how is the biggest.Can you help him?Please output m and n.(以上翻译失败,造成许多不便请谅解)
输入格式
Only one:k。(What?还是失败?)
输出格式
共两行:第一行是m的最大值,第二行是n的最大值。(What?翻译成功了?)
输入输出样例
输入 #1
1995
输出 #1
m=987
n=1597
说明/提示
20%数据:k<=100
100%数据:k<=10^8
又是一道水题……
写这个题目主要是要看懂题目意思,然后推出规律来,我当时看了是一脸懵逼,这他喵的就是考数学嘛。然后看了别人的分析才知道这是一个斐波那契数列(Fibonacci sequence)。就是m和n对应斐波那契数列的每一项,比如k=1: m=1, n =1; k=2: m =1, n=2; k=3: m=2, n=3;…
下面就是实现代码(只要找到对应项就行了)。
#include <iostream>
using namespace std;
int k;
void solve(int k)
{
int n = 1, m = 1, t;
while(n + m <= k)//循环找到最大的n和m
{
t = n;
n = n + m;
m = t;
}
cout << "m=" << m << endl;
cout << "n=" << n << endl;
}
int main()
{
cin >> k;
solve(k);
return 0;
}