SWPU 2017暑假專題訓練 矩陣快速冪

2021-09-26 06:43:20 字數 3782 閱讀 1635

a - recursive sequence hdu - 5950

遞推式:f(n) = f(n - 1) + 2 * f(n - 2) + n ^ 4

思路:這個遞推式是非線性的,但我們可以把 n ^ 4 寫成 ((n - 1) + 1) ^ 4,

n ^ 4 = c40

c_^c4

0​* (n - 1) + c41

c_^c4

1​* (n - 1) + c42

c_^c4

2​* (n - 1) + c43

c_^c4

3​* (n - 1) + c44

c_^c4

4​* (n - 1);

n ^ 3 , n ^ 2, n, 同理。

所以我們要構造乙個7 x 7的矩陣, 記錄的是記g(n - 1) =

所以我們可以通過這樣乙個矩陣來獲得g(n)

mat a =

;

這是ac**

#include

using

namespace std;

typedef

long

long ll;

const ll maxn =7;

typedef

long

long ll;

ll mod =

2147493647

;struct mat

unit;

mat mul

(mat &a, mat &b)

ret.m[i]

[j]= x;}}

return ret;

}void

init_unit()

return;}

mat pow_mat

(mat a, ll n)

a =mul(a, a)

; n >>=1;

}return ret;

}mat a =

;mat b =

;int

main()

else

if(n ==2)

mat ret =

pow_mat

(a, n -2)

; ret =

mul(ret, b)

;printf

("%i64d\n"

, ret.m[0]

[0])

;}return0;

} 片

#include

using

namespace std;

typedef

long

long ll;

const ll maxn =3;

typedef

long

long ll;

ll mod =

1e9+7;

struct mat

unit;

mat mul

(mat &a, mat &b)

ret.m[i]

[j]= x;}}

return ret;

}void

init_unit()

return;}

mat pow_mat

(mat a, ll n)

a =mul(a, a)

; n >>=1;

}return ret;

}mat a =

;mat b =

;int

main()

if(n ==3)

if(n ==4)

mat ret =

pow_mat

(a, n -4)

; ret =

mul(ret, b)

;printf

("%i64d\n"

, ret.m[0]

[0])

;}return0;

}

c - fibonacci poj - 3070

思路:就是求乙個斐波那契。。。

#include

#include

using

namespace std;

typedef

long

long ll;

const ll maxn =2;

typedef

long

long ll;

ll mod =

10000

;struct mat

unit;

mat mul

(mat &a, mat &b)

ret.m[i]

[j]= x;}}

return ret;

}void

init_unit()

return;}

mat pow_mat

(mat a, ll n)

a =mul(a, a)

; n >>=1;

}return ret;

}mat a =

;int

main()

if(n ==0)

if(n ==

1|| n ==2)

mat ret =

pow_mat

(a, n -1)

;printf

("%i64d\n"

, ret.m[0]

[0])

;}return0;

}

d - training little cats poj - 3735

看大佬部落格

#include

#include

using

namespace std;

typedef

long

long ll;

const ll maxn =

200;

//ll mod = 10000;

struct mat

unit;

ll n;

mat mul

(mat &a, mat &b)

;for

(int i =

0; i <= n; i++

)for

(int k =

0; k <= n; k++)}

}return ret;

}void

init_unit()

return;}

mat pow_mat

(mat a, ll m)

a =mul(a, a)

; m >>=1;

}return ret;

}mat a;

intmain()

a = unit;

mat b =

; b.m[n][0

]=1;

while

(k--

)else

if(ch ==

'e')

}else}}

mat ret =

pow_mat

(a, m)

; ret =

mul(ret, b)

;for

(int i =

0; i < n; i++)}

printf

("\n");

}return0;

}

2017暑假訓練國慶小假期總結

這個假期主要看完了所有網路流的知識點,看了一點簡單的建模例子,複習了一下逆元包括快速冪求大數的n次方,然後補了補樹狀陣列和線段樹的題。對於網路流最後乙個知識點,就是有上下界的網路流,所謂上界,就還是以前的邊權的最大值,不過難度增加在加了乙個邊權值的最小值。也就是流過某個邊的流量不能低於最小值,也不能...

2017暑假訓練第九天

上午剛剛看完了樹狀陣列的知識點,就自己的理解先做一下總結,整理一下學到了什麼。樹狀陣列 1.樹狀陣列的作用 使用背景 當要同時存在下述兩種運算元次的時候 1 對第x位置處的資料進行除了刪除,乘除,之外的修改 比如增加或減去乙個數 2 求某一位置的字首和。處理以上兩種情況的時候,使用簡單的陣列就不在適...

2017暑假訓練第十二天

今天的訓練主要完成了有關單調佇列的兩個題,乙個是有關於最大的全1矩陣,這個題我一開始的思路是借用了以前所學過的乙個有關求最大子矩陣和的dp題目的思路,將二維的矩陣壓縮成一維,然後求一維的最大子段和,依照這個思路,我的想法仍然是這樣合成,最後逐次對行建立單調佇列,依據單調佇列的性質求出最大的矩陣所包含...