1. 程式人生 > >bzoj 4162 shlw loves matrix II - 行列式 - 矩陣乘法 - 高斯消元

bzoj 4162 shlw loves matrix II - 行列式 - 矩陣乘法 - 高斯消元

題目大意:
給一個nn的矩陣A,求其k次方。 n 50 , k 2 10000

n\le50,k\le2^{10000}
題解:
考慮將 A k A^k 視為某個數列的第k項 h
k h_k
(嚴格意義上是矩陣列?)
嘗試改造 h h 的遞推式。
考慮: F
( x ) = A x I F(x)=|A-xI|
即A減去若干倍的單位矩陣求行列式。
以3
3的矩陣為例,它張這個樣子:
F ( x ) = A 1 , 1 x A 1 , 2 A 1 , 3 A 2 , 1 A 2 , 2 x A 2 , 3 A 3 , 1 A 3 , 2 A 3 , 3 x F(x)=\left|\begin{matrix} A_{1,1}-x & A_{1,2} & A_{1,3} \\ A_{2,1} & A_{2,2}-x & A_{2,3} \\ A_{3,1} & A_{3,2} & A_{3,3}-x \\ \end{matrix}\right|
顯然其會是一個關於x的n次多項式。
那麼根據定義有: F ( A ) = 0 F(A)=0 (啥你問我為啥帶入的不是實數而是個矩陣?其實嚴格的說法是,把F的係數copy一遍弄出一個新的以矩陣為變數的函式F’,然後根據某個C開頭的定理F’(A)=0,不過直觀"理解" F ( A ) = A I A = 0 F(A)=|A-IA|=0
總之把這個多項式的係數插值出來,可以知道:
i = 0 n f i A i = 0 \sum_{i=0}^nf_iA^i=0
那麼我要求第k項:
i = 0 n f i A i + k n = i = 0 n f n i A k i = 0 \sum_{i=0}^nf_iA^{i+k-n}=\sum_{i=0}^nf_{n-i}A^{k-i}=0
或者說:
i = 0 n f n i h k i = 0 \sum_{i=0}^nf_{n-i}h_{k-i}=0
因此可以通過 h k n , , h k 1 h_{k-n},\dots,h_{k-1} 算出 h k h_k ,套用常係數線性遞推即可。
複雜度 O ( n 4 + n 2 l g k ) O\left(n^4+n^2lgk\right) ,複雜度瓶頸在於算n次行列式和預處理 h 0 , . . . , h n 1 h_0,...,h_{n-1}

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define Rep(i,v) rep(i,0,(int)v.size()-1)
#define lint long long
#define mod 1000000007
#define ull unsigned lint
#define db long double
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define gc getchar()
#define debug(x) cerr<<#x<<"="<<x
#define sp <<" "
#define ln <<endl
using namespace std;
typedef pair<int,int> pii;
typedef set<int>::iterator sit;
inline int inn()
{
	int x,ch;while((ch=gc)<'0'||ch>'9');
	x=ch^'0';while((ch=gc)>='0'&&ch<='9')
		x=(x<<1)+(x<<3)+(ch^'0');return x;
}
const int N=53;int v[N][N],vs[N][N],a[N][N],b[N];
inline int fast_pow(int x,int k,int ans=1) { for(;k;k>>=1,x=(lint)x*x%mod) (k&1)?ans=(lint)ans*x%mod:0;return ans; }
inline int calc(int n,int x)
{
	rep(i,1,n) memcpy(vs[i],v[i],sizeof(int)*(n+1));
	rep(i,1,n) v[i][i]-=x,(v[i][i]<0?v[i][i]+=mod:0);
	int det=1;
	rep(i,1,n)
	{
		int x=i;rep(j,i,n) if(v[j][i]) x=j;
		if(i^x) swap(v[i],v[x]),det=(det?mod-det:0);
		if(!v[i][i]) { det=0;break; }x=fast_pow(v
            
           

相關推薦

bzoj 4162 shlw loves matrix II - 行列式 - 矩陣乘法 -

題目大意: 給一個nn的矩陣A,求其k次方。 n ≤ 50

bzoj 4162: shlw loves matrix II 拉格朗日插值法+矩陣乘法

題意 給定矩陣 M,請計算 M^n,並將其中每一個元素對 1000000007 取模輸出。 對於 100% 資料,滿足 n <= 2^10000;k <= 50; 0 <= Mij < 10^9 +7 分析 我們可以帶入k+1

bzoj 4162 shlw loves matrix II

ide its pre bsp display sdi 假設 spa gist 求一個 $m \times m$ 矩陣的 $n$ 次方 $m \leq 50,n \leq 2^{10000}$ sol: 特征多項式是 $f(x) = |det(Ix - A)|$,插出

bzoj 1923: [Sdoi2010]外星千足蟲【

ios eterm char max ear space \n term n+1 裸的異或高斯消元 #include<iostream> #include<cstdio> using namespace std; const int N=2005;

BZOJ 1013: [JSOI2008]球形空間產生器sphere(

題目:https://www.lydsy.com/JudgeOnline/problem.php?id=1013 思路: 存在二次項,考慮兩式相減可以把所有未知數的二次項消掉, n+1 個等式用第一個與後面的做差,形成n個不等式,然後 高斯消元即可。 程式碼: #include<c

hdu4305Lightning 生成樹計數(基爾霍夫矩陣)++逆

題意:比較裸的生成樹計數問題。   如何處理生成樹計數問題? 基爾霍夫矩陣: if i==j  Kir[i][j] = i的度數 if i!=j   Kir[i][j] = i到j的平行邊的個數的負數 即,基爾霍夫矩陣 = 度數矩陣 - 鄰接矩陣 將基爾霍夫矩陣刪去第i

【線性代數公開課MIT Linear Algebra】 第二課 矩陣

本系列筆記為方便日後自己查閱而寫,更多的是個人見解,也算一種學習的複習與總結,望善始善終吧~ 1. Gauss Elimination 高斯消元 還是從線性方程組談起,對於以下方程組: 對其求解,我們使用高斯消元法: 想辦法消掉第二個與

BZOJ4162:shlw loves matrix II

std ++ mes sizeof \n ret gauss 快速冪 printf 傳送門 利用Cayley-Hamilton定理,用插值法求出特征多項式 \(P(x)\) 然後 \(M^n\equiv M^n(mod~P(x))(mod~P(x))\) 然後就多項式快速冪

[Luogu P2973&BZOJ 1778][USACO10HOL]趕小豬DOtP(+期望)

http ios iostream 爆炸 head swa sca 選擇 main Description 一個無向圖,節點1有一個炸彈,在每個單位時間內,有可能在這個節點炸掉,也有p/q的概率隨機選擇一條出去的路到其他的節點上。問最終炸彈在每個節點上爆炸的概率。 So

【BZOJ3168】[Heoi2013]鈣鐵鋅硒維生素 矩陣的逆+匈牙利算法

def strong bzoj light sof turn 防止 宇宙 != 【BZOJ3168】[Heoi2013]鈣鐵鋅硒維生素 Description 銀河隊選手名單出來了!小林,作為特聘的營養師,將負責銀河隊選手參加宇宙比賽的飲食。眾所周知,前往宇宙的某個

BZOJ 2728 HNOI2012 與非

sca 邏輯 都是 -- cstring 位運算 不同的 ret asi 題目大意:給定k位二進制下的n個數,求[l,r]區間內有多少個數能通過這幾個數與非得到 首先觀察真值表 我們有A nand A = not A 然後就有not ( A nan

BZOJ 2466 [中山市選2009]樹(

using bzoj break ble isf 狀態 clas memset c++ 【題目鏈接】 http://www.lydsy.com/JudgeOnline/problem.php?id=2466 【題目大意】   給定一棵樹,每個節點有一盞指示燈

實現求解線性方程(矩陣去法)------c++程序設計原理與實踐(進階篇)

ipy 類型 cat sys sca solution gaussian 拷貝 img 步驟: 其中A是一個n*n的系數方陣 向量x和b分別是未知數和常量向量: 這個系統可能有0個、1個或者無窮多個解,這取決於系數矩陣A和向量b。求解線性系統的方法有很多,這裏使用一種經典

bzoj 2337 [HNOI2011]XOR和路徑【+dp】

name 直接 ring size scanf 高斯消元 str pre hnoi 首先,我們發現,因為是無向圖,所以相連的點之間是有“依賴性”的,所以不能直接用dp求解。 因為是xor,所以按位處理,於是列線性方程組,設$ x[i] $為點i到n異或和為1的期望,因為從1

bzoj 3143 [Hnoi2013]遊走【+dp】

sca source include hnoi2013 esp cst cpp std ans 參考:http://blog.csdn.net/vmurder/article/details/44542575 和2337有點像 設點u的經過期望(還是概率啊我也分不清,以下都

BZOJ 1013 [JSOI2008]球形空間產生器sphere |

math clas def 做了 bzoj n) class div com 題目: http://www.lydsy.com/JudgeOnline/problem.php?id=1013 題解: 考慮二維的我們可以明白一個道理: 兩個點左邊可以表示一個方程,然後用兩

bzoj 3143 [Hnoi2013]遊走 期望dp+

ace 保留 sca earch algorithm 整數 include 上進 連通 [Hnoi2013]遊走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3394 Solved: 1493[Submit][St

BZOJ - 1013

線性 == scan 矩陣 log vector 第一個 for i++ n維空間中給出n+1個球面上的點求圓心坐標(x0,x1,...xn-1) 任選其中一個點坐標如第一個點(a0,b0...z0) (x0-a0)^2+(x1-b0)^2+...=r^2 對於剩下的n個點

】BZOJ3503 [Cqoi2014]和諧矩陣

math esp fine eps bzoj3503 mem 組成 time ios 3503: [Cqoi2014]和諧矩陣 Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1197

bzoj 3270 博物館

inline n) int void online clu fine con zoj 題面 題目傳送門 解法 設\((x,y)\)表示第一個人在\(x\)房間,第二個人在\(y\)房間,然後列一個方程組即可 直接用高斯消元解一下就行了 時間復雜度:\(O(n^6)\) 代碼