Nowcoder 105D Fibonacci 进制 (数论)

Posted 小坏蛋_千千

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nowcoder 105D Fibonacci 进制 (数论)相关的知识,希望对你有一定的参考价值。

题目描述

Fibonacci 数是非常有名的一个数列,它的公式为 f(n)=f(n1)+f(n2),f(0)=1,f(1)=2 f ( n ) = f ( n − 1 ) + f ( n − 2 ) , f ( 0 ) = 1 , f ( 1 ) = 2

我们可以把任意一个数 x x 表示成若干不相同的 Fibonacci 数的和,比如说 14=13+1=8+5+1=8+3+2+1

如果把 Fibonacci 数列作为数的位权,即 f(i) f ( i ) 作为第 i i 位的位权,每位的系数只能是 0 或者 1 1 ,从而得到一个 01 串。比如 14 14 可以表示成 100001,11001,10111 100001 , 11001 , 10111 。 我们再把这个 01 01 串看成 2 2 进制,再转成 10 进制以后就变成了 33,25,23 33 , 25 , 23 。为了避免歧义,我们将使用最小的那个值 23 23

请按照这个过程计算一下 10 10 进制整数通过上述转换过程得到的 10 10 进制整数。

 

输入描述

第一行是一个整数 T(1T10000) T ( 1 ≤ T ≤ 10000 ) ,表示样例的个数。

以后每行一个样例,为一个十进制正整数 x(1x109) x ( 1 ≤ x ≤ 10 9 )

 

输出描述

每行输出一个样例的结果。

 

输入

5
1
10
100
1000
1000000000

 

输出

1
14
367
10966
4083305275263

 

思路

因为我们要让这一个数 x x 表示的最终结果最小,所以要将他展开的越彻底越好(注意不能出现相同的斐波那契数)

最好的情况下 x 刚好可以表示为前 k k 项的斐波那契数的和减一(因为标准的斐波那契数列前面有两个重复的 1

于是我们有:

x=(i=1kFibonacci[i])1 x = ( ∑ i = 1 k F i b o n a c c i [ i ] ) − 1
根据斐波那契数列的性质我们还有:
i=1nFibonacci[i]=Fibonacci[n+2]1 ∑ i = 1 n F i b o n a c c i [ i ] = F i b o n a c c i [ n + 2 ] − 1
因此得出:
x=Fibonacci[k+2]2 x = F i b o n a c c i [ k + 2 ] − 2
等价于:
x+2=Fibonacci[k+2] x + 2 = F i b o n a c c i [ k + 2 ]
打表得出 109 10 9 以内所有的斐波那契数,然后二分求出一个 k k 使得 Fibonacci[k+2]x+2