最近斐波那契数列的问题好多呀!

绿色夹克衫 2012-09-28 07:03:51
http://www.51nod.com/question/index.html#!questionId=627

再来一道,这个问题更有意思。解决之后的成就感更强。

有一个无穷长的数列,元素是斐波那契数列 mod 10^13, 现在给出一个数值,求该数值在这个数列中第1次出现的位置。

该数列的起始项是:0.
0 1 1 2 3 5......

比如给出377,输出14,因为第14项是377
...全文
363 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
DeDeWo 2012-09-30
  • 打赏
  • 举报
回复
fib(n) mod 10^13 元素的是这样分布的,
0,1,1,2,3,5,a1,a2,,,,,,am, 0,1,1,2,3,5,.....a1,a2......am .
liu454824891 2012-09-30
  • 打赏
  • 举报
回复
这个可以用递归来做吧,我写了个代码:
#include<stdio.h>

int fun(int n)
{
int sum1;

if(n==0)
{
return 0;
}
if(n==1)
{
return 1;
}
sum1=fun(n-1)+fun(n-2);
return sum1;
}

void main()
{
int n,sum=0;
scanf("%d",&n);
printf("%d\n",fun(n));
}
绿色夹克衫 2012-09-29
  • 打赏
  • 举报
回复
mod 之后就不是递增的了。

[Quote=引用 7 楼 的回复:]

为什么不可以呢?
对于这种题目而言,循环节都可以二分计算出来。对于每一个数从第一个循环区间二分查找这个数的位置即可,这个区间中的数一定严格递增的。


……
[/Quote]
DeDeWo 2012-09-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

有循环节长度就可以二分么?

引用 5 楼 的回复:

先暴力算出 mod 10^13 的循环节,然后就可以二分查找位置了,利用矩阵计算 fib(n) , 复杂度 O( (logn)^2 )
[/Quote]
为什么不可以呢?
对于这种题目而言,循环节都可以二分计算出来。对于每一个数从第一个循环区间二分查找这个数的位置即可,这个区间中的数一定严格递增的。

绿色夹克衫 2012-09-29
  • 打赏
  • 举报
回复
有循环节长度就可以二分么?

[Quote=引用 5 楼 的回复:]

先暴力算出 mod 10^13 的循环节,然后就可以二分查找位置了,利用矩阵计算 fib(n) , 复杂度 O( (logn)^2 )
[/Quote]
DeDeWo 2012-09-28
  • 打赏
  • 举报
回复
先暴力算出 mod 10^13 的循环节,然后就可以二分查找位置了,利用矩阵计算 fib(n) , 复杂度 O( (logn)^2 )
绿色夹克衫 2012-09-28
  • 打赏
  • 举报
回复
我的方法也类似,主要靠计算循环节长度,感觉是个log(n)^2的方法。不过常数大概是30-50左右的样子。

http://www.51nod.com/answer/index.html#!answerId=536

[Quote=引用 3 楼 的回复:]

呵呵,仅限于理论分析,
另外关于其中周期可以参考链接:
http://www.math.temple.edu/~renault/fibonacci/fib.html
[/Quote]
mathe 2012-09-28
  • 打赏
  • 举报
回复
呵呵,仅限于理论分析,
另外关于其中周期可以参考链接:
http://www.math.temple.edu/~renault/fibonacci/fib.html
绿色夹克衫 2012-09-28
  • 打赏
  • 举报
回复
哈哈,mathe大牛也感兴趣?这个问题真的很有意思!我一会儿去写个自己的方法。

[Quote=引用 1 楼 的回复:]
其实主要问题在于算mod 5^13
可以查看emath上的公式,可以看出2^(n-1)F_n(mod 5^13)可以写成一个n的25次多项式。其周期应该是4*5^13
而给定F_n=X(mod 5^13),我们可以先根据公式算出2^(n-1)F_n(mod 5)算出最小的n1,那么20k+n1就是所有的可能的n,然后再次模5^2,可以得出k(mod 5)的值,得出n必然是100k+n2的形式……
[/Quote]
mathe 2012-09-28
  • 打赏
  • 举报
回复
其实主要问题在于算mod 5^13
可以查看emath上的公式,可以看出2^(n-1)F_n(mod 5^13)可以写成一个n的25次多项式。其周期应该是4*5^13
而给定F_n=X(mod 5^13),我们可以先根据公式算出2^(n-1)F_n(mod 5)算出最小的n1,那么20k+n1就是所有的可能的n,然后再次模5^2,可以得出k(mod 5)的值,得出n必然是100k+n2的形式,一直上去即可。
而模2^13比较简单,因为周期不大

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧