矩阵模板
坚持oop!
#include<algorithm> #include<iostream> #include<cstring> #define LL long long using namespace std; #define MATRIXSIZE (10) struct MATRIX { LL lineSize,listSize; // ÁÐ ÐÐ int table[MATRIXSIZE][MATRIXSIZE]; MATRIX() { lineSize=listSize=1; memset(table,0,sizeof(table)); } MATRIX(const MATRIX &aMat) { lineSize=aMat.lineSize; listSize=aMat.listSize; for(int i=1; i<=lineSize; i++) for(int j=1; j<=listSize; j++) table[i][j]=aMat.table[i][j]; } void Read () { cin>>lineSize>>listSize; for(int i=1; i<=lineSize; i++) for(int j=1; j<=listSize; j++) cin>>table[i][j]; } void ReadOnlyTable (int tlineSize,int tlistSize) { lineSize=tlineSize; listSize=tlistSize; for(int i=1; i<=lineSize; i++) for(int j=1; j<=listSize; j++) cin>>table[i][j]; } void Print () { for(int i=1; i<=lineSize; i++) { for(int j=1; j<=listSize; j++) cout<<table[i][j]<<" "; cout<<endl; } } void Mod (LL mod) { for(int i=1; i<=lineSize; i++) for(int j=1; j<=listSize; j++) table[i][j]%=mod; } }; MATRIX operator + (MATRIX firstMat,MATRIX secondMat) { MATRIX newMat; newMat.lineSize=max(firstMat.lineSize,secondMat.lineSize); newMat.listSize=max(firstMat.listSize,secondMat.listSize); for(int i=1; i<=newMat.lineSize; i++) for(int j=1; j<=newMat.listSize; j++) newMat.table[i][j]=firstMat.table[i][j]+secondMat.table[i][j]; return newMat; } MATRIX operator + (MATRIX aMat,LL num) { MATRIX newMat=aMat; for(int i=1; i<=newMat.lineSize; i++) for(int j=1; j<=newMat.listSize; j++) newMat.table[i][j]=aMat.table[i][j]+num; return newMat; } // copy MATRIX operator - (MATRIX firstMat,MATRIX secondMat) { MATRIX newMat; newMat.lineSize=max(firstMat.lineSize,secondMat.lineSize); newMat.listSize=max(firstMat.listSize,secondMat.listSize); for(int i=1; i<=newMat.lineSize; i++) for(int j=1; j<=newMat.listSize; j++) newMat.table[i][j]=firstMat.table[i][j]-secondMat.table[i][j]; return newMat; } MATRIX operator - (MATRIX aMat,LL num) { MATRIX newMat=aMat; for(int i=1; i<=newMat.lineSize; i++) for(int j=1; j<=newMat.listSize; j++) newMat.table[i][j]=aMat.table[i][j]-num; return newMat; } MATRIX operator * (MATRIX firstMat,MATRIX secondMat) { MATRIX newMat; if (firstMat.listSize!=secondMat.lineSize) return newMat; newMat.lineSize=firstMat.lineSize; newMat.listSize=secondMat.listSize; for(int i=1; i<=newMat.lineSize; i++) for(int j=1; j<=newMat.listSize; j++) for(int o=1; o<=firstMat.listSize; o++) newMat.table[i][j]+=firstMat.table[i][o]*secondMat.table[o][j]; return newMat; } MATRIX operator * (MATRIX aMat,LL num) { MATRIX newMat=aMat; for(int i=1; i<=newMat.lineSize; i++) for(int j=1; j<=newMat.listSize; j++) newMat.table[i][j]=aMat.table[i][j]*num; return newMat; } MATRIX Matrix_BuildIdentity (MATRIX aMat) { MATRIX newMat=aMat; newMat.lineSize=aMat.lineSize; newMat.listSize=aMat.listSize; for(int i=1; i<=newMat.lineSize; i++) for(int j=1; j<=newMat.listSize; j++) if (i==j) newMat.table[i][j]=1; else newMat.table[i][j]=0; return newMat; } MATRIX Matrix_QuickPower (MATRIX aMat,LL k) { MATRIX newMat=aMat,ansMat=Matrix_BuildIdentity(aMat); while (k!=0) { if (k&1==1) ansMat=ansMat*newMat; newMat=newMat*newMat; k>>=1; } return ansMat; } int main () { return 0; }