NYOJ 斐波那契数列四吧 南工314

来源:互联网 发布:歼20 歼31 知乎 编辑:程序博客网 时间:2024/03/29 23:55

题目链接: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;}