POJ 2118 Firepersons 线性递推 矩阵快速幂
2015-01-26 16:11
288 查看
题意:给出an的通项公式,计算ai。
思路:裸的矩阵快速幂。按照给出的公式构造就可以了。
注意:在i < K的时候,要特判
思路:裸的矩阵快速幂。按照给出的公式构造就可以了。
注意:在i < K的时候,要特判
#include <cstdio> #include <algorithm> #include <vector> using namespace std; typedef long long ll; typedef vector<ll> vec; typedef vector<vec> mat; const int MOD = 10000; mat mul(mat & A, mat &B) { mat C(A.size(), vec(B[0].size())); for (int i = 0; i < A.size(); ++i) for (int k = 0; k < B.size(); k++) for (int j = 0; j < B[0].size(); ++j) C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % MOD; return C; } mat pow(mat A, ll n) { mat B(A.size(), vec(A.size())); for (int i = 0; i < A.size(); ++i) B[i][i] = 1; while (n){ if (n & 1) B = mul(B, A); A = mul(A, A); n >>= 1; } return B; } ll K,N; int main(void) { //freopen("input.txt","r",stdin); while(scanf("%lld",&K),K){ mat A(K,vec(K)); mat B(K,vec(1)); for(int i = 0; i < K; ++i) scanf("%lld",&B[K - 1 - i][0]); for(int i = 0; i < K; ++i) scanf("%lld",&A[0][i]); for(int i = 1; i < K; ++i) A[i][i-1] = 1; scanf("%lld",&N); if(N < K) printf("%lld\n",B[K - 1 - N][0]); else{ A = pow(A,N - K + 1); B = mul(A,B); printf("%lld\n",B[0][0]); } } return 0; }
相关文章推荐
- POJ 2663 Tri Tiling 线性递推 矩阵快速幂
- Firepersons - POJ 2118 矩阵乘法递推
- POJ 3420 Quad Tiling 线性递推 矩阵快速幂
- POJ 3734 Blocks 线性递推 矩阵快速幂
- POJ - 2118 矩阵乘法来解线性递推
- POJ 3420 Quad Tiling DP?递推?+矩阵快速幂
- 矩阵快速幂在常系数线性递推关系中的应用
- Poj 3734 Blocks【矩阵快速幂+递推】
- poj 3734 Blocks (递推,矩阵快速幂)
- 常系数齐次线性递推优化矩阵快速幂
- ICPC 沈阳站C题 HDU 5950 Recursive sequence 矩阵快速幂 线性递推
- POJ 2118 Matrix线性递推
- 多校第九场:贪心+矩阵快速幂中间优化+线性递推&线段树递推
- poj3070--矩阵 快速幂
- POJ 3070 Fibonacci(快速幂矩阵)
- POJ 3233 Matrix Power Series (矩阵快速幂和)
- POJ 3233 Matrix Power Series(矩阵快速幂)
- POJ 2118 矩阵乘法
- poj 3070 Fibonacci + 矩阵乘法(矩阵快速幂)
- poj - 3070 - Fibonacci(矩阵快速幂)