用矩阵求斐波那契数列,快速幂log(n),只用求最后4位(加和乘的运算中前面的位数无用)

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6. /*
  7. (x y)(x y)= (x*x+y*s x*y+y*t) =(x*x+y*s y*(x+t))
  8. (s t)(s t) (s*x+t*s s*y+t*t) (s*(x+t) t*t+y*s)
  9. (x y)(a b)= (x*a+y*c x*b+y*d)
  10. (s t)(c d) (s*a+t*c s*b+t*d)
  11. (a b)(f1=1)=(a+b)
  12. (c d)(f2=1) (c+d)
  13. */
  14. //(a,b)(c,d)一开始为E2
  15. long n,x,y,s,t,xx,yy,ss,tt,a,b,c,d,aa,bb,cc,dd;
  16. while (scanf("%ld",&n))
  17. {
  18. if (n==)
  19. {
  20. printf("0\n");
  21. continue;
  22. }
  23. else if (n==-)
  24. break;
  25. n-=;
  26. x=;
  27. y=;
  28. s=;
  29. t=;
  30. a=;
  31. b=;
  32. c=;
  33. d=;
  34. while (n)
  35. {
  36. if (n%==)
  37. {
  38. aa=a;
  39. bb=b;
  40. cc=c;
  41. dd=d;
  42. a=(x*aa+y*cc)%;
  43. b=(x*bb+y*dd)%;
  44. c=(s*aa+t*cc)%;
  45. d=(s*bb+t*dd)%;
  46. }
  47. xx=x;
  48. yy=y;
  49. ss=s;
  50. tt=t;
  51. x=(xx*xx+yy*ss)%;
  52. y=(yy*(xx+tt))%;
  53. s=(ss*(xx+tt))%;
  54. t=(tt*tt+yy*ss)%;
  55. n=n/;
  56. }
  57. printf("%ld\n",(c+d)%);
  58. }
  59.  
  60. return ;
  61. }
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6. /*
  7. (x y)(x y)= (x*x+y*s x*y+y*t) =(x*x+y*s y*(x+t))
  8. (s t)(s t) (s*x+t*s s*y+t*t) (s*(x+t) t*t+y*s)
  9. (x y)(a b)= (x*a+y*c x*b+y*d)
  10. (s t)(c d) (s*a+t*c s*b+t*d)
  11. (a b)(f1=1)=(a+b)
  12. (c d)(f2=1) (c+d)
  13. */
  14. //(a,b)(c,d)一开始为E2
  15. long n,x[],y[],s[],t[],a[],b[],c[],d[],w,r,i;
  16. x[]=;
  17. y[]=;
  18. s[]=;
  19. t[]=;
  20. a[]=;
  21. b[]=;
  22. c[]=;
  23. d[]=;
  24. for (i=;i<;i++)
  25. {
  26. x[i]=(x[i-]*x[i-]+y[i-]*s[i-])%;
  27. y[i]=(y[i-]*(x[i-]+t[i-]))%;
  28. s[i]=(s[i-]*(x[i-]+t[i-]))%;
  29. t[i]=(t[i-]*t[i-]+y[i-]*s[i-])%;
  30. }
  31. while (scanf("%ld",&n))
  32. {
  33. if (n==)
  34. {
  35. printf("0\n");
  36. continue;
  37. }
  38. else if (n==-)
  39. break;
  40. n-=;
  41. w=;
  42. r=;
  43. while (n)
  44. {
  45. if (n%==)
  46. {
  47. a[r+]=(x[w]*a[r]+y[w]*c[r])%;
  48. b[r+]=(x[w]*b[r]+y[w]*d[r])%;
  49. c[r+]=(s[w]*a[r]+t[w]*c[r])%;
  50. d[r+]=(s[w]*b[r]+t[w]*d[r])%;
  51. r++;
  52. }
  53. w++;
  54. n=n/;
  55. }
  56. printf("%ld\n",(c[r]+d[r])%);
  57. }
  58. return ;
  59. }

poj3070_斐波那契数列(Fibonacci)的更多相关文章

  1. python实现斐波那契数列(Fibonacci sequence)

    使用Python实现斐波那契数列(Fibonacci sequence) 斐波那契数列形如 1,1,2,3,5,8,13,等等.也就是说,下一个值是序列中前两个值之和.写一个函数,给定N,返回第N个斐 ...

  2. 斐波那契数列(Fibonacci) iOS

    斐波那契数列Fibonacci 斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2 ...

  3. 使用一位数组解决 1 1 2 3 5 8 13 数列问题 斐波纳契数列 Fibonacci

    斐波纳契数列 Fibonacci 输出这个数列的前20个数是什么? 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 使用数组实现输出数列的前30 ...

  4. 使用并行的方法计算斐波那契数列 (Fibonacci)

    更新:我的同事Terry告诉我有一种矩阵运算的方式计算斐波那契数列,更适于并行.他还提供了利用TBB的parallel_reduce模板计算斐波那契数列的代码(在TBB示例代码的基础上修改得来,比原始 ...

  5. 练习六:斐波那契数列(fibonacci)

    题目:斐波那契数列. 程序分析:斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.……. 在数学上,斐波那契数列 ...

  6. Java实现斐波那契数列Fibonacci

    import java.util.Scanner; public class Fibonacci { public static void main(String[] args) { // TODO ...

  7. k阶斐波那契数列fibonacci第n项求值

    已知K阶斐波那契数列定义为:f0 = 0,  f1 = 0, … , fk-2 = 0, fk-1 = 1;fn = fn-1 + fn-2 + … + fn-k , n = k , k + 1, … ...

  8. 斐波那契数列Fibonacci问题—动态规划

    斐波那契数列定义 Fibonacci array:1,1,2,3,5,8,13,21,34,... 在数学上,斐波那契数列是以递归的方法来定义: F(0) = 0 F(1) = 1 F(n) = F( ...

  9. 9 斐波那契数列Fibonacci

    题目1:写一个函数,输入n,求Fibonacci数列的第n项.该数列定义如下: n=0时,f(n)=0; n=1时,f(n)=1; n>1时,f(n)=f(n-1)+f(n-2) 1. 效率差的 ...

随机推荐

  1. 移动app rem

    (function (doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? ...

  2. Linux内核分析——Linux内核学习总结

    马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux内核学习总结 一 ...

  3. 第二个spring

    由于第一个spring已经完成,我们现在进去第二个spring! 陈志棚:成绩的统筹 李天麟:界面音乐 徐侃:代码算法   plan好布局,分配任务,控制时间!

  4. What is the difference between apache tomcat deployer and core version? - Stack Overflow

    java - What is the difference between apache tomcat deployer and core version? - Stack Overflowhttps ...

  5. Docker查看容器IP

    https://segmentfault.com/q/1010000001637726 https://blog.csdn.net/sannerlittle/article/details/77063 ...

  6. pandas重新索引

    #重新索引会更改DataFrame的行标签和列标签.重新索引意味着符合数据以匹配特定轴上的一组给定的标签. #可以通过索引来实现多个操作 - #重新排序现有数据以匹配一组新的标签. #在没有标签数据的 ...

  7. 如何实现圆形的进度条(ProgressBar)

    在我们实际的工作中可能经常使用到圆形的进度条,但是这是怎么实现的呢?其实这只不过是修改了一下ProgressBar的模板,我们在下面的代码中我们将ProgressBar的Value值绑定到Border ...

  8. rsync实现数据同步

    希望两台机器指定目录的数据保持一致 192.168.19.252(master)                 192.168.19.251(slave) /cache 拉复制            ...

  9. CSS实现水平垂直同时居中的6种思路

    前面的话 水平居中和垂直居中已经单独介绍过,本文将介绍水平垂直同时居中的6种思路 水平对齐+行高 [思路一]text-align + line-height实现单行文本水平垂直居中 <style ...

  10. CSS实现水平居中的5种思路

    前面的话 水平居中是经常遇到的问题.看似方法较多,条条大路通罗马.但系统梳理下,其实都围绕着几个思路展开.本文将介绍关于水平居中的5种思路 text-align [思路一]:在父元素中设置text-a ...