斐波那契数列 Library

http://acm.tju.edu.cn/toj/showp3267.html3267.   Library


Time Limit: 1.0 Seconds   Memory Limit: 65536K
Total Runs: 214   Accepted Runs: 96


Description

As we all know, there are very long stairs before our library in campus III of our school. It is so tired for us to go up stairs. Alpc60 has to go up and down stairs every day, what a boring walk!

One day when alpc60 went up stairs, he thought that every time he can step over one or two stairs, if there are n stairs, then how many ways he can reach the top?

The clever ACMers, can you help alpc60 to calculate how many ways he can go up n (1 ≤ n ≤ 1,000,000,000) stairs.

Because the number of the answer will be so large, you must output the number module by 9901.

Input

Each line of the input contains a number n indicating the stairs number.

Input is ended with -1 which is not the stairs number.

Output

For each case of the input output the possible ways module by 9901.

Sample Input

1
2
5
-1

Sample Output

1
2
8

Hint: The Bruce force method will simply lead to the Time Limit Exceeded error, try some efficient method to solve this problem.

Source: NUDT Programming Contest 2009

题意 : 上楼梯, 每次都可以上1节或2节,求有几种上楼方式,是一个典型的斐波那契数列,某状态可以是从两种情况来的,1,上两节到这儿,2,上1节到这儿,就是f[n] = f[n-1]+f[n-2]

但是因为数会很大所以要用到矩阵,和快速矩阵幂

  1 /*
  2   快速幂矩阵法
  3   dp 动态规划
  4   a[n] = a[n-1]+ a[n-2];  这是一个典型的斐波那契数列  一般斐波那契数列算到20的时候已经很大了所以一般来说要用快速法
  5   构造矩阵有
  6   a[n-1] = q[n-1];  为了构造一个矩阵
  7   上下两式分析有  [ a[n]   ] = [1,1]*[a[n-1]]
  8                 [ a[n-1] ] = [1,0] [a[n-2]]
  9   其中要自定义矩阵的乘法
 10   然后递推得  转化成求矩阵幂的问题
 11 */
 12
 13 #include<cstdio>
 14 #include<cmath>
 15 #define N 9901
 16 using namespace std;
 17 struct mtx{
 18 //    int n;// 矩阵的阶数
 19     int a[2][2];
 20     mtx operator * (const mtx o) const {
 21         mtx c;
 22 //        return c.n = n ;
 23     c.a[0][0]= c.a[0][1] = c.a[1][0] = c.a[1][1] = 0;//做乘法前初始化
 24         for(int i = 0 ; i < 2 ; i++ )
 25         {
 26             for(int j = 0 ; j < 2 ; j++)
 27             {
 28                 for(int k = 0 ; k < 2 ; k++)
 29                 {
 30                     c.a[i][j] += ((a[i][k]%N)*(o.a[k][j]%N))%N;
 31                     c.a[i][j] %= N;
 32                 }
 33             }
 34         }
 35         return c;
 36     }
 37 };//定义矩阵乘法
 38 /*  如果 递归的写数幂是
 39 int f(int a ,int b)
 40 {
 41     int ret = 1;
 42     if (b == 1 ) return a;
 43     int t = f(a,b/2)
 44     t = t*t;
 45     if(b&1)  return t*a;
 46     return  t;
 47 }
 48
 49 但是矩阵的乘法一般不写递归形式,因为递归用栈来存储,会爆内存
 50
 51 非递归形式写数幂
 52
 53 int f (int a , int b)
 54 {
 55     int ret = 1;
 56     while(b > 0)
 57     {
 58         if(b&1) ret *= a;
 59         a *= a;
 60         b >>= 1;
 61     }
 62     return ret;
 63 }
 64 int f(int a ,int b )
 65 {
 66     int ret;
 67     for( ret = 1 ; b ; b>>=1)
 68     {
 69         if(b&1) ret*=a;
 70         a = a * a;
 71     }
 72     return ret;
 73 }
 74
 75 int f (int a , int b)
 76 {
 77     int ret ;
 78     for(ret = 1 ; b ; b>>=1 , a = a * a %Mod)
 79     if(b&1) ret = ret*a%N;////+=要比加快。。。。。也可以写成ret*=a;  ret %=a;
 80     return ret;
 81 }
 82 */
 83
 84 mtx f(int b)
 85 {
 86     mtx t;
 87     mtx haha ;
 88     haha.a[0][0] = haha.a[0][1] = haha.a[1][0] = 1;
 89     haha.a[1][1] = 0;
 90
 91     t.a[0][1] = t.a[1][0] = 0;
 92     t.a[1][1] = t.a[0][0] = 1;
 93     mtx ret ;
 94     //if(b==1)  return t;
 95     for(ret = t ; b ; b>>=1)
 96     {
 97 //    printf("%d\n", b);
 98         if(b&1) ret = ret * haha ;
 99         haha = haha * haha;
100     }
101     return ret;
102 } //快速幂矩阵
103
104
105 int main()
106 {
107     int cnt ;
108     while(~scanf("%d",&cnt)&&cnt!=-1)
109     {
110         mtx ans;
111         ans = f(cnt-1);
112     //    printf("%d %d\n%d %d\n", ans.a[0][0], ans.a[0][1], ans.a[1][0], ans.a[1][1]);
113         int sum = (1*ans.a[0][0]+1*ans.a[0][1])%N;
114         printf("%d\n",sum);
115     }
116     return 0 ;
117 } 
时间: 2024-08-19 15:23:48

斐波那契数列 Library的相关文章

用递归和非递归的方法输出斐波那契数列的第n个元素(C语言实现)

费波那契数列(意大利语:Successione di Fibonacci),又译为费波拿契数.斐波那契数列.费氏数列.黄金分割数列. 在数学上,费波那契数列是以递归的方法来定义: {\displaystyle F_{0}=0} {\displaystyle F_{1}=1} {\displaystyle F_{n}=F_{n-1}+F_{n-2}}(n≧2) 用文字来说,就是费波那契数列由0和1开始,之后的费波那契系数就是由之前的两数相加而得出.首几个费波那契系数是: 0, 1, 1, 2, 3

Fibonacci斐波拉契数列----------动态规划DP

n==10 20 30 40 50 46 体验一下,感受一下,运行时间 #include <stdio.h>int fib(int n){ if (n<=1)     return 1; else            return fib(n-1)+fib(n-2); }int main( ){ int n; scanf("%d",&n); printf("%d\n" ,fib(n) );} 先 n==10 20 30 40 50 46

《剑指Offer》题目——斐波拉契数列

题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.(n<=39) 题目分析:如果使用简单的递归,很容易造成栈溢出.采用递推的方式即可. 代码: public class Fibonacci { public static int fibonacci(int n){ int res[] = new int[2]; res[0]=1; res[1]=1; int temp = 0; if(n==0) return 0; if(n<=2) return res[

js算法集合(二) javascript实现斐波那契数列 (兔子数列) Javascript实现杨辉三角

js算法集合(二)  斐波那契数列.杨辉三角 ★ 上一次我跟大家分享一下做水仙花数的算法的思路,并对其扩展到自幂数的算法,这次,我们来对斐波那契数列和杨辉三角进行研究,来加深对Javascript的理解. 一.Javascript实现斐波那契数列 ①要用Javascript实现斐波那契数列,我们首先要了解什么是斐波那契数列:斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为

斐波那契数列

前几天学了javascript,挺难的比之前学的H5难多了,之前还觉得H5很难,一比较之下就相形见绌了. 在JS里面代码什么的还是蛮简单的,就是逻辑问题让你绕不过来....在这些逻辑问题里又有一个既难而且十分经典的问题,那就是斐波那契数列. 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数列",指的是这样一个数列:1.1.2.3.5.8.13.21.34

斐波那契数列(分析别人的代码)

斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........ 这个数列从第3项开始,每一项都等于前两项之和. n1 = 0 #给n1赋初始值 n2 = 1 #给n1赋初始值 count = 0 #给计数器初始值 while count < 10: #循环条件为计数器小于10 nth = n1 + n2 #n

快速求斐波那契数列(矩阵乘法+快速幂)

斐波那契数列 给你一个n:f(n)=f(n-1)+f(n-2) 请求出 f(f(n)),由于结果很大请 对答案 mod 10^9+7; 1<=n<=10^100; 用矩阵乘法+快速幂求斐波那契数列是经典应用: 矩阵公式 C i j=C i k *C k j; 根据递推式 构造2*2矩阵: 原始矩阵 1 0 0 1 矩阵 2 1 1 1 0 原始矩阵与矩阵 2相乘达到转化状态效果: 对矩阵二进行快速幂 乘法:达到快速转化矩阵的效果: 即使达到快速转化状态:那么大的数据范围也很难求解: 高精?这有

每日一九度之 题目1075:斐波那契数列

时间限制:5 秒 内存限制:32 兆 特殊判题:否 提交:3517 解决:2028 题目描述: 编写一个求斐波那契数列的递归函数,输入n值,使用该递归函数,输出如样例输出的斐波那契数列. 输入: 一个整型数n 输出: 题目可能有多组不同的测试数据,对于每组输入数据, 按题目的要求输出相应的斐波那契图形. 样例输入: 6 样例输出: 0 0 1 1 0 1 1 2 3 0 1 1 2 3 5 8 0 1 1 2 3 5 8 13 21 0 1 1 2 3 5 8 13 21 34 55 这题可以直

php实现斐波那契数列以及由此引起的联想

斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)在现代物理.准晶体结构.化学等领域,斐波纳契数列都有直接的应用.————摘自百度百科 公式: F(n)=F(n