斐波拉契数列,枚举
题意:
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),这个上界也很宽松,不会超时
题意:
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]是否合法