1. 程式人生 > >Recursive sequence 矩陣快速冪解遞推公式

Recursive sequence 矩陣快速冪解遞推公式

1. 通常

首先能用矩陣快速冪優化的遞推型別是f[n]=5f[n-3]+6f[n-2]+2f[n-1]+n^2+n+8之類的

也就是說遞推是線性遞推且f[n-i]前面的係數是常數,可以含有與n有關的多項式,也可以含有常數的這種遞推

2.比如以下

fn=2fn2+fn1+n4


通常左邊是f(n )及其後幾項 根據具體情況定

而右邊則是f(n-1) 開頭的 對應左邊的每一個都是n-1

但是n-1 ^4 要怎麼變到n ^4 ?

這就要求我們構造了     

要n-1^4  --> n ^4


這就是右邊的式子 對應寫出左邊的式子即可

已經寫出兩邊式子就可以求出A矩陣了。

最後給出矩陣快速冪模板

typedef long long ll;
ll M = 2147493647L;
class Matrix{
public:
    ll mat[7][7]={
        {1,2,1,4,6,4,1},
        {1,0,0,0,0,0,0},
        {0,0,1,4,6,4,1},
        {0,0,0,1,3,3,1},
        {0,0,0,0,1,2,1},
        {0,0,0,0,0,1,1},
        {0,0,0,0,0,0,1}
    };
    Matrix operator*(const Matrix& m)const{
        Matrix tmp;
        for(int i = 0 ; i < 7; i++){
            for(int j = 0 ; j < 7 ; j++){
                tmp.mat[i][j] = 0;
                for(int k = 0 ; k < 7 ; k++){
                    tmp.mat[i][j] += mat[i][k]*m.mat[k][j]%M;
                    tmp.mat[i][j] %= M;
                }
            }
        }
        return tmp;
    }

};
Matrix Pow(Matrix &m , int k){
    Matrix ans;
    memset(ans.mat , 0 , sizeof(ans.mat));
    for(int i = 0 ; i < 7 ; i++)
        ans.mat[i][i] = 1;
    while(k){
        if(k&1)
            ans = ans*m;
        k >>= 1;
        m = m*m;
    }
    return ans;
}
int T;
int main() {
    int T;
    ll a,b,n;
    scanf("%d",&T);
    while(T--) {
        scanf("%I64d %I64d %I64d",&n,&a,&b);
        Matrix m;
        Matrix A=Pow(m,n-2);
        ll ans=(A.mat[0][0]*b+A.mat[0][1]*a+A.mat[0][2]*16+A.mat[0][3]*8+A.mat[0][4]*4+A.mat[0][5]*2+A.mat[0][6]*1)%M;
        cout<<ans<<endl;
    }
}

  及其後幾項 看具體情況定

相關推薦

Recursive sequence 矩陣快速公式

1. 通常首先能用矩陣快速冪優化的遞推型別是f[n]=5f[n-3]+6f[n-2]+2f[n-1]+n^2+n+8之類的也就是說遞推是線性遞推且f[n-i]前面的係數是常數,可以含有與n有關的多項式,也可以含有常數的這種遞推2.比如以下fn=2fn−2+fn−1+n4通常左

HDU 5950 - Recursive sequence - [矩陣快速加速][2016ACM/ICPC亞洲區瀋陽站 Problem C]

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=5950 Farmer John likes to play mathematics games with his N cows. Recently, they are attracted by recursive

POJ3070 Fibonacci(矩陣快速加速)【模板題】

題目連結:傳送門 題目大意:   求斐波那契數列第n項F(n)。   (F(0) = 0, F(1) = 1, 0 ≤ n ≤ 109) 思路:   用矩陣乘法加速遞推。 演算法競賽進階指南的模板: #include <iostream> #include &l

洛谷P1357 花園(狀態壓縮 + 矩陣快速加速

題目連結:傳送門 題目: 題目描述 小L有一座環形花園,沿花園的順時針方向,他把各個花圃編號為1~N(2<=N<=10^15)。他的環形花園每天都會換一個新花樣,但他的花園都不外乎一個規則,任意相鄰M(2<=M<=5,M<=N)個花圃中有不超過K(1&

HDU5950-Recursive sequence(矩陣快速)

題意: 給出n頭母牛,第一頭報a,第二頭報b,第i頭報f[i-2]*2+f[i-1]+i^4,問第n頭母牛報數多少。 思路: 就是推公式啊,可惜沒經驗,白搭。 自己推得時候一直不知道i^4怎麼消去,原來是可以加上i^3,i^2,i,再算的。總之相乘的矩陣必須都是常數,

HDU5950-Recursive sequence(矩陣快速

題意:給出n頭母牛,第一頭報a,第二頭報b,第i頭報f[i-2]*2+f[i-1]+i^4,問第n頭母牛報數多少 題目大意:   Fi=Fi-1+2Fi-2+i4。給定F1和F2求Fn。 題目思路:   【遞推+矩陣快速冪】   現場用算了1個多小時的公式過了。

矩陣快速優化式 例:斐波那契數列

首先是一點基礎知識: ① 矩陣相乘的規則:矩陣與矩陣相乘 第一個矩陣的列數必須等於第二個矩陣的行數 假如第一個是m*n的矩陣 第二個是n*p的矩 陣則結果就是m*p的矩陣且得出來的矩陣中元素具有

矩陣快速 ——(表示式)

 矩陣快速冪  首先知道矩陣       矩陣(Matrix)是一個按照長方陣列排列的複數或實數集合;      矩陣乘法: 定義:設A為  m×p  的矩陣,B為  p×n  的矩陣,那麼稱  m×n  的矩陣C為矩陣A與B的乘積,記作  C=A×B ,其中矩陣C中

Queuing(矩陣快速and模板))

【題目來源】:https://vjudge.net/problem/HDU-2604 【題意】 f,m分別是female與male的縮寫,假設有一個佇列裡面是這些字母縮寫,長度為L,那麼共有2^L種,如果含有fmf或者fff這種子佇列的佇列被稱為0佇列,其餘

Recursive sequence 矩陣快速 + 組合數 非線性變線性,利用到了組合數(楊輝三角求解快)

Farmer John likes to play mathematics games with his N cows. Recently, they are attracted by recursive sequences. In each turn, the cows would stand in a

UVA 10689 Yet another Number Sequence 矩陣快速 水呀水

技術分享 ont truct string esp while .com tdi 快速冪 #include <iostream> #include <cstdio> #include <cstring> #include &

Sequence 矩陣快速 + 費馬小定理

f[1] = 1 f[2] = a ^ b 其實不是很好的去想到取log的  兩邊同時取log 然後 F[2] = b  F[1] = 0 則 f[n] = a^(F[n]) % p   費馬小定理 :  ① 判斷素數,對於大素數的判定,Miller-R

HDU 6395 Sequence 矩陣快速+分塊

Let us define a sequence as below Your job is simple, for each task, you should output Fn module 109+7. Input The first line has only

【HDU1005】Number Sequence(矩陣快速)

記錄一個菜逼的成長。。 題目連結 題目大意: f[1] = 1,f[2] = 1,f[n] = (a*f[n-1]+b*f[n-2])%7(n > 2) 給你a,b。求f[n]。

hdu 5667 Sequence(矩陣快速+費馬小定理+快速)

#include <cstdio> #include <iostream> #include <cstring> #include <string> #include <cstdlib> #include <algorithm> #inc

HDU 5667 Sequence 矩陣快速 + 費馬小定理

olion August will eat every thing he has found.     Now there are many foods,but he does not want to eat all of them at once,so he find a

HDU 5667 Sequence (矩陣快速+費馬小定理)

Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2687    Acce

HDU 5667 Sequence(矩陣快速+費馬小定理)

大意: He gives you 5 numbers n,a,b,c,p,and he will eat fn foods.But there are only p foods,so you should tell him fn mod p. Inpu

hdu 5667 Sequence(矩陣快速)

Holion August will eat every thing he has found.Now there are many foods,but he does not want to eat all of them at once,so he find a sequence.fn=⎧⎩⎨⎪⎪1