每次在家真的只想玩,放假这么多天,感觉远远还没玩够。。。今天下午掏出电脑,可惜以网不好为理由玩起了游戏,晚上看了会电视之后才看了看矩阵快速幂,然后成功A出一道水题,很明显矩阵快速幂功能是计算矩阵的幂。。。主要是解决求递推公式的高位项,应该是模板性知识点,主要是求通项公式,然后找到对应转移矩阵,明天再弄弄这个地方,最后想说在家里看电视的感觉还是挺好的,家人坐一块无聊的电视剧也会觉得也可以看一看。
贴上矩阵快速幂模板,来自:http://blog.csdn.net/hikean/article/details/9749391
# include<cstdio>
# include<cstring>
using namespace std;
#define NUM 50
int MAXN,n,mod;
struct Matrix//矩阵的类
{
int a[NUM][NUM];
void init() //将其初始化为单位矩阵
{
memset(a,0,sizeof(a));
for(int i=0;i<MAXN;i++)
a[i][i]=1;
}
} A;
Matrix mul(Matrix a,Matrix b) //(a*b)%mod 矩阵乘法
{
Matrix ans;
for(int i=0;i<MAXN;i++)
for(int j=0;j<MAXN;j++)
{
ans.a[i][j]=0;
for(int k=0;k<MAXN;k++)
ans.a[i][j]+=a.a[i][k]*b.a[k][j];
ans.a[i][j]%=mod;
}
return ans;
}
Matrix add(Matrix a,Matrix b) //(a+b)%mod //矩阵加法
{
int i,j,k;
Matrix ans;
for(i=0;i<MAXN;i++)
for(j=0;j<MAXN;j++)
{
ans.a[i][j]=a.a[i][j]+b.a[i][j];
ans.a[i][j]%=mod;
}
return ans;
}
Matrix pow(Matrix a,int n) //(a^n)%mod //矩阵快速幂
{
Matrix ans;
ans.init();
while(n)
{
if(n%2)//n&1
ans=mul(ans,a);
n/=2;
a=mul(a,a);
}
return ans;
}
Matrix sum(Matrix a,int n) //(a+a^2+a^3....+a^n)%mod// 矩阵的幂和
{
int m;
Matrix ans,pre;
if(n==1)
return a;
m=n/2;
pre=sum(a,m); //[1,n/2]
ans=add(pre,mul(pre,pow(a,m))); //ans=[1,n/2]+a^(n/2)*[1,n/2]
if(n&1)
ans=add(ans,pow(a,n)); //ans=ans+a^n
return ans;
}
void output(Matrix a)//输出矩阵
{
for(int i=0;i<MAXN;i++)
for(int j=0;j<MAXN;j++)
printf("%d%c",a.a[i][j],j==MAXN-1?'\n':' ');
}
int main()
{
freopen("in.txt","r",stdin);
Matrix ans;
scanf("%d%d%d",&MAXN,&n,&mod);
for(int i=0;i<MAXN;i++)
for(int j=0;j<MAXN;j++)
{
scanf("%d",&A.a[i][j]);
A.a[i][j]%=mod;
}
ans=sum(A,n);
output(ans);
return 0;
}
一道模板题:http://poj.org/problem?id=3070
题意:对于斐波那契数列f(n),给一个n,求f(n)%10000,n<=1e9;
代码:
#include<iostream>
#include<string>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<queue>
#include<cstring>
#include<map>
using namespace std;
#define M 2
#define mod 10000
struct Matrix{
Matrix(){memset(a,0,sizeof(a));}
int a[M][M];
void init()
{
memset(a,0,sizeof(a));
for(int i=0;i<M;i++)
a[i][i]=1;
}
}A;
Matrix mul(Matrix a,Matrix b) //(a*b)%mod
{
Matrix ans;
int i,j,k;
for(i=0;i<M;i++)
for(j=0;j<M;j++)
{
for(k=0;k<M;k++)
ans.a[i][j]+=a.a[i][k]*b.a[k][j];
ans.a[i][j]%=mod;
}
return ans;
}
Matrix pow(Matrix a,int n) //(a^n)%mod
{
Matrix ans;
ans.init();
while(n)
{
if(n&1)
ans=mul(ans,a);
n>>=1;
a=mul(a,a);
}
return ans;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==-1)
break;
if(n==0)
cout<<0<<endl;
else if(n==1)
cout<<1<<endl;
else
{
A.a[0][0]=1;
A.a[0][1]=1;
A.a[1][0]=1;
A.a[1][1]=0;
A=pow(A,n-2);
printf("%d\n",(A.a[0][0]+A.a[0][1])%mod);
}
}
return 0;
}