sicily 14550 Interesting Integers
2015-11-10 20:04
381 查看
斐波拉契数列,枚举
题意:
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]是否合法
题意:
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]是否合法
相关文章推荐
- soj1005. Roll Playing Games
- soj1041. Pushing Boxes
- Sicily 1007 To and Fro
- 中大周赛 2014年每周一赛第二场 Meet and Greet
- sicily 3980 二进制转十进制
- sicily 1137 河床
- sicily 6084 Times17
- sicily 1375 Balanced lineup
- sicily 1282 Computer Game
- sicily 1140 国王的遗产
- sicily 1513 Decoding
- sicily 1544 Integer Generator
- sicily 1558 He is Offside!
- sicily 1875 Small tree
- sicily 2015 A New Year Gift
- sicily 8842 Mirko's Exam
- sicily 8843 Ranking and Friendship
- sicily 9094 Cows in a Row
- sicily 9160 ESEJ
- sicily 9162 RAZLIKA