zoukankan      html  css  js  c++  java
  • Interesting Integers Gym

    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 a 0 and b 0 with the same property, for which b 0 < b, or for which b 0 = b and a 0 < a.

    Sample in- and output

    Input

    5

    89

    123

    1000

    1573655

    842831057

    Output

    1 1

    1 3

    2 10

    985 1971

    2 7

    这道题赛后看大佬们用的都是扩展欧几里得,懵。。。

    我写的介个算法,坑点比较多,数据上细节比较多,稍不留神就容易错

    奇葩思路A的,代码:

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 long long INF = 1e9+5;
     5 
     6 //有数据用到了long long,就干脆把所有整数都开成longlong了,丢...
     7 int main()
     8 {
     9     long long t, x, a, b, re1, re2;
    10     long long data1, data2, t1, t2;
    11     long long aa[55], i, j;
    12     aa[1] = 1;
    13     aa[2] = 1;
    14     for(i=3; i<50; i++)
    15     {
    16         aa[i] = aa[i-1] + aa[i-2];
    17     }
    18     scanf("%lld", &t);
    19 
    20     while(t--)
    21     {
    22         scanf("%lld", &x);
    23         for(i=48; i>=0; i--)
    24         {
    25             if(aa[i]+aa[i+1]<=x)   //这句剪枝不能没有,没有会T,
    26                  //想一下,这样就可以减少好多没有意义的80000次循环,何乐而不为?
    27             {
    28                 for(j=1; j<=80000; j++)  //在不T的条件下尽量扩大范围
    29                 {
    30                     if((x-aa[i+1]*j)%aa[i]==0&&(x-aa[i+1]*j)/aa[i]>0&&(x-aa[i+1]*j)/aa[i]<=j) break;
    31                 }
    32                 if(j<=80000) break;
    33             }
    34         }
    35         printf("%lld %lld
    ", (x-aa[i+1]*j)/aa[i], j);
    36     }
    37     return 0;
    38 }
  • 相关阅读:
    CodeForces Gym 100935G Board Game DFS
    CodeForces 493D Vasya and Chess 简单博弈
    CodeForces Gym 100935D Enormous Carpet 快速幂取模
    CodeForces Gym 100935E Pairs
    CodeForces Gym 100935C OCR (水
    CodeForces Gym 100935B Weird Cryptography
    HDU-敌兵布阵
    HDU-Minimum Inversion Number(最小逆序数)
    七月馒头
    非常可乐
  • 原文地址:https://www.cnblogs.com/0xiaoyu/p/11435579.html
Copyright © 2011-2022 走看看