1. 程式人生 > >51nod 1242 斐波那契數列的第N項 (矩陣快速冪)

51nod 1242 斐波那契數列的第N項 (矩陣快速冪)

斐波那契數列的定義如下: F(0) = 0 F(1) = 1 F(n) = F(n - 1) + F(n - 2) (n >= 2) (1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, ...) 給出n,求F(n),由於結果很大,輸出F(n) % 1000000009的結果即可。 Input
輸入1個數n(1 <= n <= 10^18)。
Output
輸出F(n) % 1000000009的結果。
Input示例
11
Output示例
89

#include <iostream>
#include <algorithm>
#include <cmath>
#define MOD 1000000009
#define N 2
using namespace std;

struct Matrix 
{
	long long v[N][N];
};

Matrix matrix_mul(Matrix A, Matrix B, long long m)
{
	Matrix ans;

	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			ans.v[i][j] = 0;
			for (int k = 0; k < N; k ++)
			{
				ans.v[i][j] += (A.v[i][k] * B.v[k][j]) % m;
			}
			ans.v[i][j] %= m;
		}
	}
	return ans;
}

Matrix matrix_pow(Matrix C, long long n, long long m)
{
	Matrix ans = {1, 0, 0, 1};
	while (n)
	{
		if (n & 1)
			ans = matrix_mul(ans, C, m);
		C = matrix_mul(C, C, m);
		n >>= 1;
	}
	return ans;
}

int main()
{
	long long n;
	Matrix temp1 = {1, 1, 1, 0}, temp2 = {1, 0, 1, 0}; // temp2{f[2],0,f[1],0}!!!!!   temp1[a,b,1,0] ---> f[n]=a*f[n-1]+b*f[n-2]
	while (cin >> n)
	{
		if (n < 2)
		{
			cout << 1 << endl;
			continue;
		}
		Matrix res = matrix_pow(temp1, n - 2, MOD);
		res = matrix_mul(res, temp2, MOD);
		cout << res.v[0][0] << endl;
	}
	return 0;
}


相關推薦

數列NC++

求斐波那契數的第N項,N可以很大但結果不能超過1000位; #include <iostream> #include <memory.h> #include <strin

矩陣快速 + 求數列nFibonacci

兩矩陣相乘,樸素演算法的複雜度是O(N^3)。如果求一次矩陣的M次冪,按樸素的寫法就是O(N^3*M)。既然是求冪,不免想到快速冪取模的演算法,前面有快速冪取模的介紹,a^b %m 的複雜度可以降

51nod 1242 數列N 矩陣快速

斐波那契數列的定義如下: F(0) = 0 F(1) = 1 F(n) = F(n - 1) + F(n - 2) (n >= 2) (1, 1, 2, 3, 5, 8, 13, 2

51Nod-數列N矩陣快速

 收藏 關注 斐波那契數列的定義如下: F(0) = 0 F(1) = 1 F(n) = F(n - 1) + F(n - 2) (n >= 2) (1, 1, 2

數列Nf(N)[矩陣快速]

string sin int code char const mat ret truct 矩陣快速冪   定義矩陣A(m*n),B(p*q),A*B有意義當且僅當n=p。即A的列數等於B的行數。   且C=A*B,C(m*q)。   例如:   進入正題,由於現

使用線性代數求解數列n

一:問題 已知斐波那契數列,f1=1,f2=1,f3=3,f4=5...求第n項的數值 二:問題轉化為線性代數問題 可以得到方程 f(n+2)=f(n+1)+f(n) 為了解決問題,新增方程 f(n+1)=f(n+1) 記向量,則上兩式可以寫作 要求,只需知道,

數列n矩陣快速

矩陣快速冪是用來求解遞推式的,所以第一步先要列出遞推式:  f(n)=f(n-1)+f(n-2) 第二步是建立矩陣遞推式,找到轉移矩陣: ,簡寫成T * A(n-1)=A(n),T矩陣就是那個2*2的常數矩陣,而 這裡就是個矩陣乘法等式左邊:1*f(n-1)+1

數列n的三種求法

方法1:         利用遞迴方法,但是遞迴看似簡單但是無法處理較大的項數,時間複雜度為o(2^n)。 public class fib_遞迴 { /** * @param args */ public static

java遞迴求數列n

public class Fibonacci { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int f

遞迴用python求解數列n

      波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的

求解數列n(JavaBigInteger之自底向上迭代)

import java.math.BigInteger; import java.util.*; public class Fab //用迭代法自底向上求解斐波那契數列第n項 { publi

數列N的最後一位

RT,該怎麼求呢? 首先,你可能會想到,順序遍歷求解。 利用通項公式,可以得到斐波那契序列: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34... 那每一項的最後一位就是: 0, 1, 1, 2, 3, 5, 8, 3, 1, 4... 這樣做的效

Java練習題-求數列n

/** * 求斐波那契數列第n項,n<30,斐波那契數列前10項為 1,1,2,3,5,8,13,21,34,55 * @author Tang * */ public clas

數列N

#include<stdio.h> int FibonacciSequence(int n) { int f1=1; int f2=1; int f3=1; for(int i=3;i<=n;i++) { f3=f1+f2; f1=f2;

數列n的高效解法

參考書籍《劍指Offer》 常見解法 談及斐波那契數列,我們直接就可以想到f(n)=f(n-1)+f(n-2)。於是做出如下解: long long Fibonacci(unsigned

HDOJ 4549 M數列 費馬小定理+矩陣快速

MF( i ) = a ^ fib( i-1 ) * b ^ fib ( i )   ( i>=3) mod 1000000007 是質數 , 根據費馬小定理  a^phi( p ) = 1

HDU 4549 M數列 (費馬小定理+矩陣快速)

分析: 寫出F[n]的幾項之後發現a和b的指數和斐波那契數列有關      具體的關係是      F[n]=a^fib[n-1] * b^fib[n]      矩陣快速冪求fib    快速冪求a和b的n次冪 題目要求對F[n]%mod    這

51Nod 1242 數列N 矩陣快速

斐波那契數列的定義如下:   F(0) = 0 F(1) = 1 F(n) = F(n - 1) + F(n - 2) (n >= 2)   (1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377,

51nod 1242 數列N

斐波那契數列的定義如下:   F(0) = 0 F(1) = 1 F(n) = F(n - 1) + F(n - 2) (n >= 2)   (1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 2

51Nod 1242 數列N ——————杜教篩,BM板子

1242 斐波那契數列的第N項 基準時間限制:1 秒 空間限制:131072 KB 分值: 0 難度:基礎題 收藏 關注 斐波那契數列的定義如下: F(0)=0F(1)=1F(n)=F(n−1)+F(n−2)(n&gt;=2)F(0) = 0 \\ F