先给出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; }