矩陣快速冪 高斯消元解遞推方程 HDU6185

2021-08-07 15:13:45 字數 1729 閱讀 5480

題目描述

輸入there are no more than 5000 test cases.

each test case only contains one positive integer n(1 ≤ n ≤ 1018) in a line.

輸出for each test cases, output the answer mod 1000000007 in a line.

樣例輸入1 2

樣例輸出1 5

題意:用沒有數量限制2×1和1×2的矩形去鋪一塊4×n的矩形,有多少種方法。

但是可以觀察到此題的資料範圍很大,達到了1e18,我們自然而然的想到應該要找規律,可能要用到矩陣快速冪

猜測是線性遞推方程,根據其他的公式得出n<=10情況下的方案數

1 1

2 5

3 11

4 36

5 95

6 281

7 781

8 2245

9 6336

10 18061

根據這十個數利用高斯消元,先假設是f(n)=f(n-1)*a+f(n-2)*b

如果高斯消元得到的結果不是整數接著試

最終f(n)=f(n-1)*a+f(n-2)*b+f(n-3)*c+f(n-4)*d

//f(n)=f(n-1)*a+f(n-2)*b+f(n-3)*c+f(n-4)*d情況下的高斯消元

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn=105;

typedef

double matrix[maxn][maxn];

matrix a,s;

//n是方程的個數

void gauss(matrix a,int n)

}for(i=n-1; i>=0; i--)

return

0;}

執行得到結果

1.00

5.00

1.00

-1.00

所以f(n)=f(n-1)+f(n-2)*5+f(n-3)-f(n-4)

然後根據遞推公式用矩陣快速冪解決

值得注意的是由於矩陣係數有負數,在做矩陣相乘時注意+mod再取膜

#include 

#include

#include

#include

#define ll long long

using

namespace

std;

ll mod=1000000007;

struct matrix

;matrix multi(matrix x,matrix y)

return ans;

}matrix mqmod(ll l)

return q;

}int main()

else

if(n==2)

else

if(n==3)

else

if(n==4)

else

}return

0;}

高斯消元解xor方程 poj1830

莫隊長最喜歡的一類東西。上次聽賴神講線性相關之前,莫隊長說他講的高斯消元最簡單,一開始不信,後來賴神講了之後。呃 其實賴神講的也不是很難接受,但聽他講了之後現在卻沒什麼印象了,果然跨度還是太大了。poj1830 典型的xor方程組,每個開關根據與其他開關關係建立方程,其跟自己肯定相關,相關係數為1,...

高斯消元解線性方程組

高斯消去法是消去法的一種特殊形式,它包括消元和回帶兩個過程。高斯消去法求解線性方程組分為以下兩大步 1 將係數矩陣a經過一系列的初等行變換程式設計右上三角矩陣,其常數向量b也同時做相應的變換,即 在變換過程中,採用原地工作,即經變換後的元素仍存放在原來的儲存單元中。為了實現上述目標,對於k從1到n ...

高斯消元法求方程組的解

高斯消元法 也叫行化簡法 簡單地來說就是構造方程組的增廣矩陣,將增廣矩陣化為階梯型,將每一行主元位置化為1,主元下面元素都為0。最後從下往上依次代入求解。至於主元的選擇,最簡單的就是從第一行開始依次選取主對角線上的元素,但是這樣做的有一點需要注意就是如果主元非常小,就可能除了之後產生非常大的數字,可...