Interesting Integers(暴力枚举)

                                        Interesting Integers

                                                                      时间限制: 1 Sec  内存限制: 128 MB
                                                                                      提交: 16  解决: 3
                                                                       [提交][状态][讨论版][命题人:admin

Undoubtedly you know of the Fibonacci numbers. Starting with F1 = 1 and F2 = 1, every next number is the sum of the two
previous ones. This results in the sequence 1, 1, 2, 3, 5, 8, 13, . . .. Now let us consider more generally sequences that obey the same recursion relation

                                                                       Gi = Gi−1 + Gi−2 for i > 2
but start with two numbers G1 ≤ G2 of our own choice. We shall call these Gabonacci sequences. For example, if one uses G1 = 1 and G2 = 3, one gets what are known as the Lucas numbers: 1, 3, 4, 7, 11, 18, 29, . . .. These numbers are – apart from 1 and 3 – different from the Fibonacci numbers. By choosing the first two numbers appropriately, you can get any number you like to appear in the Gabonacci sequence. For example, the number n appears in the sequence that starts with 1 and n − 1, but that is a bit lame. It would be more fun to start with numbers that are as small as possible, would you not agree?
Input
On the first line one positive number: the number of test cases, at most 100.

After that per test case:
• one line with a single integer n (2 ≤ n ≤ 109): the number to appear in the sequence.
Output
Per test case:
• one line with two integers a and b (0 < a ≤ b), such that, for G1 = a and G2 = b, Gk = n for some k. These numbers should be the smallest possible, i.e., there should be no numbers a0 and b0 with the same property, for which b0 < b, or for which b0 = b and a0 < a.

Input

5
89
123
1000
1573655
842831057

Output

1 1
1 3
2 10
985 1971
2 7

解题:斐波那契第n项:a[n]=f[n-1]*x+f[n]*y;      

f[n]:f[1]=0,f[2]=1;的斐波那契数列。枚举n与y看能否整除f[n-1],且除数x<=y。x:斐波那契第一项,y:斐波那契第二项。

注意 break跳出 减少耗时

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define Max(a,b) (a>b?a:b)
using namespace std;
#define ll long long

int main ()
{

    int f[1005], ans ;
    int  y,x;

    f[1]=0;
    f[2]=1;


    for(int i=3; i<=50; i++)
    {

        f[i]=f[i-1]+f[i-2];

    }

    int T;
    scanf("%d",&T);

    while(T--)
    {

        scanf("%d",&ans);

        if(ans==1 || ans==2)
        {

            printf("1 1\n");
            continue;

        }

        int flag=0;
        for(int i=45; i>2; i--)
        {
            if(!flag)
            {
                for(int j=1; j<=1000000; j++)
                    if(j*f[i]+f[i-1]>ans)//斐波那契第n项:a[n]=f[n-1]*x+f[n]*y;
                        break;//break 的耗时少
                    else if((ans-j*f[i])%f[i-1]==0 && (ans-j*f[i])/f[i-1]<=j)//x是整数并且   x<=y
                    {
                        y=j,x=(ans-j*f[i])/f[i-1],flag=1;//找最小的
                        break;
                    }
            }
        }


        printf("%d %d\n",x,y);

    }

    return 0;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值