这本应该是昨天写的一篇博客,今天去看莫名其妙的不见了,草稿箱回收站都没有,不知道去哪了。我绝对没有做梦。
首先我们得知道矩阵乘法的规则,还好我大一线性代数没有挂科,这点我还是会的,矩阵乘法就是,左行乘上右列。
好了然后我们得知道快速幂的算法及原理。举一个简单的例子,a的11次方:11的二进制等于1011,看做11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1,然后我们的a的11次方就等于:。我们每次把指数(也就是这里的11)右移一位,如果末尾是1就乘上我们的y;y的数值每次右移都要平方一次,这样才是指数的指数。矩阵快速幂类似。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <ctime>
using namespace std;
struct node
{
__int64 a[10][10];
node operator *(const node k2)
{
node p;
memset(p.a,0,sizeof(p.a));
for (int i=0;i<3;i++)
for (int j=0;j<3;j++)
for (int k=0;k<3;k++)
p.a[i][j]+=a[i][k]*k2.a[k][j];
return p;
}
}d1,d2;
int i,j,k,n;
void ksm(int n)
{
while (n)
{
if (n & 1)
d2=d2*d1;
n>>=1;
d1=d1*d1;
}
return ;
}
int main()
{
srand(time(NULL));
while (scanf("%d",&n))
{
for (i=0;i<3;i++)
for (j=0;j<3;j++)
{
d1.a[i][j]=rand()%10;
d2.a[i][j]=0;
}
for (i=0;i<3;i++)
{
for (j=0;j<3;j++)
printf("%d ",d1.a[i][j]);
cout<<endl;
}
cout<<endl;
d2.a[0][0]=d2.a[1][1]=d2.a[2][2]=1;
ksm(n);
for (i=0;i<3;i++)
{
for (j=0;j<3;j++)
printf("%I64d ",d2.a[i][j]);
cout<<endl;
}
}
}