#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 2;
const int MOD = 10000;
int n;//是幂
struct MATRIX
{
int mat[2][2];
};
MATRIX multiply(MATRIX a,MATRIX b,int n)//n是规模
{
MATRIX c;
memset(c.mat,0,sizeof(c.mat));
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
if(a.mat[i][k])
for(int j=0;j<n;j++)
if(b.mat[k][j])
{
c.mat[i][j]+=a.mat[i][k]*b.mat[k][j];
if(c.mat[i][j]>=MOD)
c.mat[i][j]%=MOD;
}
return c;
}
MATRIX E;
void quick(MATRIX a,int n)//幂
{
memset(E.mat,0,sizeof(E.mat));
for(int i = 0; i < N ; i++)
E.mat[i][i] = 1;
while(n)
{
if(n&1)
E = multiply(E,a,N);
n>>=1;
a = multiply(a,a,N);
}
}
int main()
{
MATRIX A1,T;
while(scanf("%d",&n) &&n != (-1))
{
if(n==0)
printf("0\n");
else
{
T.mat[0][0] = 1;
T.mat[0][1] = 1;
T.mat[1][0] = 1;
T.mat[1][1] = 0;
A1.mat[0][0] = 1;
A1.mat[0][1] = 0;
quick(T,n-1);
printf("%d\n",multiply(A1,E,N).mat[0][0]);
}
}
}
poj 3233
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N1 = 60;
const int N2 = 30;
struct MAT1
{
int mat[N1][N1];
};
struct MAT2
{
int mat[N2][N2];
};
int N,K,MOD;//N是规模,K是幂,MOD是取余
MAT1 T;
MAT1 S;
void add1(MAT2 a)//T
{
memset(T.mat,0,sizeof(T.mat));
for(int i = 0 ; i < N; i++)
T.mat[i][i] = 1;
for(int i = 0 ;i < N ; i++)
for(int j = N; j < 2*N ; j++ )
T.mat[i][j] = a.mat[i][j - N];
for(int i = N ; i < 2*N; i++)
for(int j = N ; j < 2*N ;j++)
T.mat[i][j] = a.mat[i-N][j-N];
}
MAT1 multiply(MAT1 a,MAT1 b, int n)//
{
MAT1 c;
memset(c.mat,0,sizeof(c.mat));
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
if(a.mat[i][k])
for(int j=0;j<n;j++)
if(b.mat[k][j])
{
c.mat[i][j]+=a.mat[i][k]*b.mat[k][j];
if(c.mat[i][j]>=MOD)
c.mat[i][j]%=MOD;
}
return c;
}
MAT1 quick(MAT1 a,int n)//mi
{
MAT1 E;
memset(E.mat,0,sizeof(E.mat));
for(int i = 0 ; i < 2*N ; i++)
E.mat[i][i] = 1;
while(n)
{
if(n&1)
E = multiply(E,a,2*N);
n>>=1;
a = multiply(a,a,2*N);
}
return E;
}
MAT1 O;
void add2(MAT2 a)
{
memset(O.mat,0,sizeof(O.mat));
for(int i = 0 ; i < N ; i++)
for(int j = 0; j < N ; j++ )
O.mat[i][j] = a.mat[i][j];
for(int i = N ; i < 2*N ; i++)
for(int j = 0; j < N ; j++ )
O.mat[i][j] = a.mat[i-N][j];
}
int main()
{
scanf("%d%d%d",&N,&K,&MOD);
MAT2 A;
for(int i = 0 ; i < N ; i++)
for(int j = 0 ; j < N ;j++)
scanf("%d",&A.mat[i][j]);
add1(A);
T = quick(T,K-1);//E
add2(A);
S = multiply(T,O,2*N);
for(int i = 0 ; i < N ;i++)
{
for(int j = 0 ; j < N ; j++)
{
if(j==0)
printf("%d",S.mat[i][j]);
else
printf(" %d",S.mat[i][j]);
}
printf("\n");
}
}
poj 2276
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
const int MAXN = 100;
using namespace std;
typedef struct MATRIX
{
int mat[MAXN][MAXN];
}MAT;
int N,K;
int MOD = 2;
MAT light;
MAT T;
MAT multiply(MAT a,MAT b,int n)//矩阵乘法
{
MAT c;
memset(c.mat,0,sizeof(c));
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
if(a.mat[i][k])
for(int j=0;j<n;j++)
if(b.mat[k][j])
{
c.mat[i][j]+=a.mat[i][k]*b.mat[k][j];
if(c.mat[i][j]>=MOD)
c.mat[i][j]%=MOD;
}
return c;
}
MAT quick(MAT a,int n)//矩阵快速幂
{
MAT E;
memset(E.mat,0,sizeof(E.mat));
for(int i = 0; i < N ; i++)
E.mat[i][i] = 1;
while(n>0)
{
if(n&1)
E = multiply(E,a,N);
n>>=1;
a = multiply(a,a,N);
}
return E;
}
int main()
{
int K;
string a;
while(scanf("%d",&K)!=EOF)
{
cin >> a;
N = a.length();
memset(light.mat,0,sizeof(light.mat));
memset(T.mat,0,sizeof(T.mat));
for(int i = 0 ; i < N ;i++)
light.mat[i][0] = (a[i]-'0');//灯最初的状态
for(int i = 0 ; i < N ; i++)//构造系数矩阵
{
if(i == 0)
{
T.mat[i][0] = 1;
T.mat[i][N-1] = 1;
}
else
{
T.mat[i][i-1] = 1;
T.mat[i][i] = 1;
}
}
T = quick(T,K);
light = multiply(T,light,N);
for(int i = 0 ; i < N; i++ )
{
printf("%d",light.mat[i][0]);
}
printf("\n");
}
return 0;
}