51Nod-斐波那契數列的第N項(矩陣快速冪)
輸入1個數n(1 <= n <= 10^18)。Output
輸出F(n) % 1000000009的結果。Input示例
11Output示例
89李陶冶(題目提供者) 大神連結:https://zhuanlan.zhihu.com/p/19768646
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<limits.h> #include<algorithm> #include<queue> #include<stack> #include<vector> #include<math.h> #include<map> using namespace std; #define Mod 1000000009 struct node { __int64 c[2][2]; }; node a; node work(node x,node y) { node t={0}; int i,j,k; for(i=0;i<2;i++) for(j=0;j<2;j++) for(k=0;k<2;k++) { t.c[i][j]+=(x.c[i][k]*y.c[k][j])%Mod; t.c[i][j]%=Mod; } return t; } node Pow(node x,__int64 n) { node temp=x; if(n<0) return temp; while(n) { if(n&1) { temp=work(temp,x); n--; } x=work(x,x); n/=2; } return temp; } int main() { __int64 n; scanf("%I64d",&n); a.c[0][0]=1; a.c[0][1]=1; a.c[1][0]=1; a.c[1][1]=0; node ans=Pow(a,n-2); printf("%I64d\n",ans.c[0][0]); }
相關推薦
斐波那契數列第N項(C++)
求斐波那契數的第N項,N可以很大但結果不能超過1000位; #include <iostream> #include <memory.h> #include <strin
矩陣快速模冪 + 求斐波那契數列第n項(Fibonacci)
兩矩陣相乘,樸素演算法的複雜度是O(N^3)。如果求一次矩陣的M次冪,按樸素的寫法就是O(N^3*M)。既然是求冪,不免想到快速冪取模的演算法,前面有快速冪取模的介紹,a^b %m 的複雜度可以降
51Nod-斐波那契數列的第N項(矩陣快速冪)
收藏 關注 斐波那契數列的定義如下: F(0) = 0 F(1) = 1 F(n) = F(n - 1) + F(n - 2) (n >= 2) (1, 1, 2
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
斐波那契數列第N項f(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 這
案例:求斐波那契數列第n位是多少封裝函式
//斐波那契數列:1,1,2,3,5,8,13,21,34,55… //我們寫一個函式getFB()就是用來求斐波那契數列第n位的數是多少. //把已經求過的項用物件儲存起來,以後如果還要求這個項就直接取出來用,這樣就解決了效能低下的問題. funct
藍橋杯——斐波那契數列第n個取餘10007的結果
藍橋杯要求的輸入和輸出一定要一模一樣,不需要多餘的輸入或者輸出!#include<stdio.h>int main(){int F[1000000] = {1,1};int n,i,m;scanf("%d",&n);for(i = 2;i < n;i
斐波那契數列的第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, 23