先给出Matrix67 大神给出的十种矩阵使用的例子
http://www.matrix67.com/blog/archives/276
HDU 2371 给出一个字符串和置换方法以及置换次数 求最后得到的字符串
矩阵乘法水之
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#define MAXN 100
using namespace std;
struct Matrix
{
int size;
int element[MAXN][MAXN];
void setSize(int);
Matrix operator* (Matrix);
Matrix power(int);
};
void Matrix::setSize(int a)
{
for (int i=0; i<a; i++)
for (int j=0; j<a; j++)
element[i][j]=0;
size = a;
}
Matrix Matrix::operator* (Matrix param)
{
Matrix product;
product.setSize(size);
for (int i=0; i<size; i++)
for (int j=0; j<size; j++)
for (int k=0; k<size; k++)
product.element[i][j]+=element[i][k]*param.element[k][j];
return product;
}
Matrix Matrix::power(int exp)
{
Matrix res,A;
A=*this;
res.setSize(size);
for(int i=0;i<size;i++)
res.element[i][i]=1;
while(exp)
{
if(exp&1)
res=res*A;
exp>>=1;
A=A*A;
}
return res;
}
char str[100];
int n,m;
int squ[100],tsqu[100];
Matrix a;
int main()
{
while(~scanf("%d%d",&n,&m))
{
if(n==0 && m==0)break;
a.setSize(n);
for(int i=0;i<n;i++)
{
int tmp;
squ[i]=i;
scanf("%d",&tmp);
a.element[tmp-1][i]=1;
}
a=a.power(m);
gets(str);
gets(str);
for(int i=0;i<n;i++)
{
int tmp=0;
for(int j=0;j<n;j++)
tmp+=a.element[i][j]*squ[j];
tsqu[i]=tmp;
}
for(int i=0;i<n;i++)
printf("%c",str[tsqu[i]]);
printf("\n");
}
return 0;
}