線性代數的內容,應該是學計算機的必修課,就不多講內容了,主要是在程式設計時的用法。
有數列a[n
]=4∗
a[n−
1]+2
a[n]=4*a[n-1]+2
a[n]=4
∗a[n
−1]+
2,我們可以寫出兩個矩陣
項矩陣:a[1
],1a[
1],1
乘積矩陣:
\ \把項矩陣乘一次乘積矩陣,得到了
\也就是
\,所以a[n
]a[n]
a[n]
只要項矩陣乘n−1
n-1n−
1次就可以得到。
舉個例子,斐波那契數列f[n
]=f[
n−1]
+f[n
−2
]f[n]=f[n-1]+f[n-2]
f[n]=f
[n−1
]+f[
n−2]
因為乙個遞推式有3項了,所以我們也要擴充套件一下項矩陣
項矩陣:
\\乘積矩陣:
\\乘一次(項矩陣左乘乘積矩陣)得
\\即
\\快速冪同int
intin
t的快速冪
#include
#include
#define ll long long
#define maxn 109
const ll mod =
1e9+7;
const
int size=5;
struct matrix
matrix operator*(
const matrix & x)
const}}
return ans;}}
;matrix pow
(matrix a,
int b)
return ans;
}int
main()
zjnu 1697
求斐波那契數列第n項
#include
#include
#define d long long
#define n 5
#define mod ((int)1e4+7)
struct matrix
void
init()
}}void
out(
)printf
("\n");
}}matrix operator*(
const matrix & x)
const}}
return ans;}}
;matrix swift
(matrix a,
int t)
return ans;
}int
main()
}
原題:zjnu 1265
題意:
給n個硬幣排成一排,求有3個及以上朝向相同的排列數
a3=2,a4=6…
解析:
找規律,若n個硬幣時不符合要求的有bn,有b2=4,b3=6,b4=10 --> bn=b(n-1)+b(n-2)
得:an=2^n-bn
則有an=2^n-bn
a(n-1)=2^(n-1)-b(n-1)
a(n-2)=2^(n-2)-b(n-2)
(2)+(3)得: a(n-1)+a(n-2)=2n-2(n-2)-b(n-1)-b(n-2)
–> a(n-1)+a(n-2)=2n-2(n-2)-bn
–> a(n-1)+a(n-2)=an-2^(n-2)
得出an通項:an=
a(n−
1)+a
(n−2
)+2(
n−2)
an=a(n-1)+a(n-2)+2^(n-2)
an=a(n
−1)+
a(n−
2)+2
(n−2
) 構造矩陣
**:
#include
#include
#include
#define d long long
#define n 109
#define mod ((int)1e4+7)
using
namespace std;
struct matrix
void
init()
}}void
out(
)printf
("\n");
}}matrix operator*(
const matrix & x)
const}}
return ans;}}
;matrix swift
(matrix a,
int t)
return ans;
}d swift
(d a,d mul)
return re;
}int
main()
快速冪(矩陣快速冪)
求 3 0 3 1 3 n mod 1000000007 input 輸入乙個數n 0 n 10 9 output 輸出 計算結果 sample input 3sample output 40 分析 利用等比數列的求和公式得所求和是 3 n 1 1 2,如果暴力求3 n 1 會超時,這裡引入快速冪來...
快速冪 矩陣快速冪
快速冪 正常情況下求乙個數的冪時間複雜度為o n 而快速冪能把時間複雜度降到o logn 舉個例子 求5的13次方 思想首先把13化為二進位制 1101,即13 1101 8 1 4 1 2 0 1 1 即5 13 58 1 54 1 52 0 5 1 15 5 8 1 5 4 1 5 2 0 5 ...
快速冪 矩陣快速冪
快速冪 我們求a ba b ab最直接的方法就是把a乘b次這樣的話複雜度就是o n o n o n 但是在比賽時面對1e9的資料時還是會輕鬆超時的,此時就需要一種更快的乘法來幫助我們 我們把b拆成二進位制的形式得到a ba b ab a 10.01 a a1 0.01此時對b分解得到的序列10.01...