POJ3233 Matrix Power Series 矩阵快速幂
#include<stdio.h>
#include<string.h>
using namespace std;
int n,m;
struct Mat
{
int m[61][61];
Mat(){memset(m,0,sizeof(m));}
void print()
{
for(int i=0;i<n;i++)
for(int j=n;j<2*n;j++)
{
printf("%d",m[i][j]);
j==2*n-1?putchar('\n'):putchar(' ');
}
}
};
Mat multi(const Mat &a,const Mat &b)
{
Mat c;
for(int i=0;i<2*n;i++)
for(int j=0;j<2*n;j++)
for(int k=0;k<2*n;k++)
c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j]%m)%m;
return c;
}
Mat pow(Mat &a,int k)
{
Mat b;
for(int i=0;i<2*n;i++) b.m[i][i]=1;
while(k)
{
if(k&1) b=multi(b,a);
a=multi(a,a);
k>>=1;
}
return b;
}
int main()
{
int k,x;
Mat A;
scanf("%d%d%d",&n,&k,&m);
for(int i=0;i<n;i++)
for(int j=n;j<2*n;j++)
{
scanf("%d",&x);
A.m[i][j]=x%m;
A.m[i+n][j]=A.m[i][j];
A.m[i][i]=1;
}
pow(A,k).print();
return 0;
}
/*
S(n)=S(n-1)+A(n)
|S(n-1)|->|S(n)|
|A(n-1)|->|A(n)|
|E A|*|S(n-1)|=|S(n)|
|0 A|*|A(n-1)|=|A(n)|
|E A|n*|S(0)|=|S(n)|
|0 A| *|A(0)|=|A(n)|
S(0)=1;
A(0)=1;
|E A|n=|S(n)|
|0 A| =|A(n)|
*/
快速幂
long long pow(long long a,int k,long long mod)//快速幂取模
{
long long b=1;
while(k)
{
if(k&1) b=b*a%mod;
a=a*a%mod;
k>>=1;
}
return b;
}