给定一个nXn的矩阵A 和正整数k,m。如果
S=A+A^2+A^3+.........A^k,
求个元素对吗取余数后的结果。
同样,根据矩阵递推出关于k的式子,用乘幂的方法解决。
题源来自《挑战程序竞赛》第二版 204页。
//
// 204_Matrix power series (POJ 3233).cpp
// changlle
//
// Created by user on 1/28/16.
// Copyright (c) 2016 user. All rights reserved.
//
#include <iostream>
#include <vector>
using namespace std;
typedef vector<int> vec;
typedef vector<vec> mat;
typedef long long ll;
const int M=4;
int n=2;
int k=2;
mat A(2,vec(2));
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];
return C;
}
mat pow (mat A, ll n ){
mat B(A.size(),vec(A[0].size()));
for (int i=0;i<A.size();i++)
B[i][i]=1;
while (n>0) {
if (n &1) B=mul(B,A);
A=mul(A,A);
n>>=1;
}
return B;
}
void solve (){
mat B(n*2, vec(n*2));
for (int i=0;i<n;i++) {
for (int j=0;j<n;j++)
B[i][j]=A[i][j];
B[n+i][i]=B[n+i][n+i]=1;
}
B=pow(B,k+1); //I+A+A^2+......A^k
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
int a=B[n+i][j];
if (i==j) a=a-1;
a=a%M;
cout<<a<<" ";
}
cout<<endl;
}
}
int main() {
A[0][0]=0; A[0][1]=1;
A[1][0]=1; A[1][1]=1;
solve();
return 0;
}