sicily 14550 Interesting Integers

斐波拉契数列,枚举

题意:
fib[i]=fib[i-1]+fib[i-2].给出n,现在要使f[0]和f[1]尽量小(0<f[0]<=f[1]),使得存在某个f[k]=n
第一关键字是f[1],第二关键字是f[0]

数据范围:
样例数t<=100,n<=10^9

思路:

斐波拉契数列也是一个指数函数,就算f[0]=f[1]=1,要爆10^9,只需到f[44].

第一想法是枚举f[0]和f[1],然后把未超过n的项算出来,看有无等于n的,这样的复杂度是O(n2*44),不过这是个宽松的上界,一般很少有到达n2的情况.可惜样例数t<=100,还是有些样例导致了超时

考虑斐波拉契对应的矩阵幂A^m,容易知道f[k]=A^(k-1).[0][0]*f[1]+A^(k-2).[0][1]*f[0].如果不用矩阵,也可以直接用斐波拉契数列表示f[k]=fib[k-1]*f[1]+fib[k-2]*f[0]

上面式子的未知数有三个k,f[1],f[0].虽然k不知道,但是f[k]我们是知道它要等于n的.我们可以枚举f[1]和k.外层是f[1],内层是k.这样上面式子包括f[0]都可以求出来,然后判断f[0]是否是正整数,是的话还要最小(主要出现了符合条件的f[0],那么f[1]是确定的了,但k要继续变大扫描,k越大f[0]会越小,最后取合法的f[0]的最小值).这样的复杂度是O(n*44),这个上界也很宽松,不会超时

总结:f[k]=fib[k-1]*f[1]+fib[k-2]*f[0].枚举f[1]和k,判断f[0]是否合法


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值