題目描述
輸入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。最後從下往上依次代入求解。至於主元的選擇,最簡單的就是從第一行開始依次選取主對角線上的元素,但是這樣做的有一點需要注意就是如果主元非常小,就可能除了之後產生非常大的數字,可...