Nowcoder 105D Fibonacci 进制 (数论)
Posted 小坏蛋_千千
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nowcoder 105D Fibonacci 进制 (数论)相关的知识,希望对你有一定的参考价值。
题目描述
Fibonacci 数是非常有名的一个数列,它的公式为 f(n)=f(n−1)+f(n−2),f(0)=1,f(1)=2 f ( n ) = f ( n − 1 ) + f ( n − 2 ) , f ( 0 ) = 1 , f ( 1 ) = 2 。
我们可以把任意一个数 x x 表示成若干不相同的 Fibonacci 数的和,比如说 。
如果把 Fibonacci 数列作为数的位权,即 f(i) f ( i ) 作为第 i i 位的位权,每位的系数只能是 或者 1 1 ,从而得到一个 串。比如 14 14 可以表示成 100001,11001,10111 100001 , 11001 , 10111 。 我们再把这个 01 01 串看成 2 2 进制,再转成 进制以后就变成了 33,25,23 33 , 25 , 23 。为了避免歧义,我们将使用最小的那个值 23 23 。
请按照这个过程计算一下 10 10 进制整数通过上述转换过程得到的 10 10 进制整数。
输入描述
第一行是一个整数 T(1≤T≤10000) T ( 1 ≤ T ≤ 10000 ) ,表示样例的个数。
以后每行一个样例,为一个十进制正整数 x(1≤x≤109) x ( 1 ≤ x ≤ 10 9 ) 。
输出描述
每行输出一个样例的结果。
输入
5
1
10
100
1000
1000000000
输出
1
14
367
10966
4083305275263
思路
因为我们要让这一个数 x x 表示的最终结果最小,所以要将他展开的越彻底越好(注意不能出现相同的斐波那契数)
最好的情况下 刚好可以表示为前 k k 项的斐波那契数的和减一(因为标准的斐波那契数列前面有两个重复的 )
于是我们有:
根据斐波那契数列的性质我们还有:
∑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 F i b o n a c c i [ k + 2 ] = x + 2 ):显然此时的答案等于 2k−1 2 k − 1
- 对于一般的情况( Fibonacci[k+Nowcoder 105D Fibonacci 进制 (数论)