题目链接:here~~
设一个方程x*f(1)+y*f(2)=f(20),方程的解x和y代表f(20)由x个f(1)和y个f(2)组成,我们看一下斐波拉契数列:
1,1, 2, 3, 5,8,13,21,34......第18项2584,第19项4181,第20项6765
可知:f(20)=f(18)+f(19),也可以写为f(20)=2584*f(1)+4181*f(2),因为斐波那契数列的前两项都为1,所以它的第20项是有2584个1和4181个1组成,可以推出,凡是符合f(n)=f(n-1)+f(n-2)的数列,第20项总是由2584个第1项和4181个第2项组成,即f(20)=2584*f(1)+4181*f(2);然后枚举即可就出本题的解
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n, m, a, b, i, flag;
double k;
cin>>n;
while (n--)
{
cin>>m;
flag=0;
for (i=0; (m-4181*i)/2584>=0; i++)
{
k=((double)m-4181*i)/2584;
if (k==floor(k))
{
flag=1;
a=k;
b=i;
break;
}
}
if (flag) cout<<a<<" "<<b<<endl;
else cout<<"No answer\n";
}
return 0;
}