poj3070_斐波那契数列(Fibonacci)

用矩阵求斐波那契数列,快速幂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==0)
19         {
20             printf("0\n");
21             continue;
22         }
23         else if (n==-1)
24             break;
25         n-=2;
26         x=0;
27         y=1;
28         s=1;
29         t=1;
30         a=1;
31         b=0;
32         c=0;
33         d=1;
34         while (n)
35         {
36             if (n%2==1)
37             {
38                 aa=a;
39                 bb=b;
40                 cc=c;
41                 dd=d;
42                 a=(x*aa+y*cc)%10000;
43                 b=(x*bb+y*dd)%10000;
44                 c=(s*aa+t*cc)%10000;
45                 d=(s*bb+t*dd)%10000;
46             }
47             xx=x;
48             yy=y;
49             ss=s;
50             tt=t;
51             x=(xx*xx+yy*ss)%10000;
52             y=(yy*(xx+tt))%10000;
53             s=(ss*(xx+tt))%10000;
54             t=(tt*tt+yy*ss)%10000;
55             n=n/2;
56         }
57         printf("%ld\n",(c+d)%10000);
58     }
59
60     return 0;
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[32],y[32],s[32],t[32],a[32],b[32],c[32],d[32],w,r,i;
16     x[0]=0;
17     y[0]=1;
18     s[0]=1;
19     t[0]=1;
20     a[0]=1;
21     b[0]=0;
22     c[0]=0;
23     d[0]=1;
24     for (i=1;i<32;i++)
25     {
26         x[i]=(x[i-1]*x[i-1]+y[i-1]*s[i-1])%10000;
27         y[i]=(y[i-1]*(x[i-1]+t[i-1]))%10000;
28         s[i]=(s[i-1]*(x[i-1]+t[i-1]))%10000;
29         t[i]=(t[i-1]*t[i-1]+y[i-1]*s[i-1])%10000;
30     }
31     while (scanf("%ld",&n))
32     {
33         if (n==0)
34         {
35             printf("0\n");
36             continue;
37         }
38         else if (n==-1)
39             break;
40         n-=2;
41         w=0;
42         r=0;
43         while (n)
44         {
45             if (n%2==1)
46             {
47                 a[r+1]=(x[w]*a[r]+y[w]*c[r])%10000;
48                 b[r+1]=(x[w]*b[r]+y[w]*d[r])%10000;
49                 c[r+1]=(s[w]*a[r]+t[w]*c[r])%10000;
50                 d[r+1]=(s[w]*b[r]+t[w]*d[r])%10000;
51                 r++;
52             }
53             w++;
54             n=n/2;
55         }
56         printf("%ld\n",(c[r]+d[r])%10000);
57     }
58     return 0;
59 }
时间: 2024-10-14 01:58:43

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

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

使用Python实现斐波那契数列(Fibonacci sequence) 斐波那契数列形如 1,1,2,3,5,8,13,等等.也就是说,下一个值是序列中前两个值之和.写一个函数,给定N,返回第N个斐波那契数字.例如,1返回1 6返回8 我选择了两种方法,一种是将list变成一个队列,另一个则是使用环形队列.不多说,直接上代码:后面我会对为什么这样实现做一个解释 第一个是使用队列的方式: 1 def fibonacciSeq(num): 2 fibonacciSeqList = [] 3 for

Java实现斐波那契数列Fibonacci

import java.util.Scanner; public class Fibonacci { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in=new Scanner(System.in); System.out.println("斐波那契数列的个数是:"); int total=in.nextInt(); System.out.println("

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

题目:斐波那契数列. 程序分析:斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.……. 在数学上,斐波那契数列是以递归的方法来定义: F0 = 0 (n=0)F1 = 1 (n=1)Fn = F[n-1]+ F[n-2](n=>2)--------------------- 方法一:使用递归计算 1 def fibonacci(month): 2 if month == 1: 3 return 1 4 el

C# 4种方法计算斐波那契数列 Fibonacci

F1: 迭代法 最慢,复杂度最高 F2: 直接法 F3: 矩阵法 参考<算法之道(The Way of Algorithm)>第38页-魔鬼序列:斐波那契序列 F4: 通项公式法 由于公式中包含根号5,无法取得精确的结果,数字越大误差越大 1 using System; 2 using System.Diagnostics; 3 4 5 namespace Fibonacci 6 { 7 class Program 8 { 9 static void Main(string[] args) 1

斐波拉契数列(Fibonacci) 的python实现方式

第一种:利用for循环 利用for循环时,不涉及到函数,但是这种方法对我种小小白来说比较好理解,一涉及到函数就比较抽象了... 1 >>> fibs = [0,1] 2 >>> for i in range(8): 3 fibs.append(fibs[-2] + fibs[-1]) 4 5 >>> fibs 6 [0, 1, 1, 2, 3, 5, 8, 13, 21, 34] 或者说输入一个动态的长度: 1fibs = [0,1] 2num = i

使用循环解决斐波那契数列Fibonacci sequence

1 # encoding:utf-8 2 ''' 3 Created on 2017年8月7日 4 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子, 5 小兔子长到第三个月后每个月又生一对兔子, 6 假如兔子都不死,问每个月的兔子总数为多少? 7 知识链接: 8 1.在使用函数传递变量时不要同全局变量的名称一样 9 2.全局变量在函数中使用时,需要用 global声明 10 @author: wangtaoyuan 11 ''' 12 new = 1#刚出生的小兔子对数 13

c#斐波那契数列(Fibonacci)(递归,非递归)

public static int Foo(int i)        {            if (i < 3)            {                return 1;            }            else            {                return Foo(i - 1) + Foo(i - 2);            }        } static void Main(string[] args)        { 

MIT Python 第四课函数抽象与递归简介 最后三分钟递归的经典案例:斐波那契数列

斐波那契数列Fibonacci Sequence,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*) 有一对一个月大的一公一母的兔子,再过一个月的时候交配生小兔子,假设它们生的是两只一公一母的小兔子,在下一个月末这两只小兔子也有了后代同样是一公一母,问题是一年后你会有多少只小兔子?[呲牙]第三年的时候就像到了澳大利亚... >>&g

斐波拉契数列应用

斐波拉契数列的应用实例 什么是斐波拉契数列(Fibonacci sequence)?将其前几项写出来就是:0 1 1 2 3 5 8 13 21....... 观察不难发现其规律是,从第二项起,每一项的值都为前两项的和.而且这个数列有趣的地方就在于这个非常特殊的规律.它是有通项公式的,但是推导与主题无关,而且也几乎用不上,所以就不多叙述. long fi(int n) { if(n==1||n==2) return 1; else return fi(n-1)+fi(n-2); } 但是如果这样