#include #include #include #include using namespace std; typedef vector< vector > Matrix; const int MOD = 1<<15; Matrix mem[26]; Matrix parseExpr(const string &str, int &idx); Matrix parseTerm(const string &str, int &idx); Matrix parseFactor(const string &str, int &idx); Matrix parsePrimary(const string &str, int &idx); Matrix parseRowseq(const string &str, int &idx); void printMatrix(const Matrix &A){ int n = A.size(), m = A[0].size(); for(int i=0;i(m, 0)); for(int i=0;i(m, 0)); for(int i=0;i(mB,0)); for(int i=0;i(n,0)); for(int i=0;i(m,0)); for(int i=0;i= A.size()) A.push_back(vector(0)); A[x+i].push_back(B[i][j]); } } } Matrix parseExpr(const string &str, int &idx){ Matrix res = parseTerm(str, idx); while(str[idx] == '+'||str[idx] == '-'){ char op = str[idx++]; Matrix tmp = parseTerm(str, idx); if(op == '+') res = add(res, tmp); if(op == '-') res = sub(res, tmp); } return res; } Matrix parseTerm(const string &str, int &idx){ Matrix res = parseFactor(str, idx); while(str[idx] == '*'){ idx++; Matrix tmp = parseFactor(str, idx); res = mul(res, tmp); } return res; } Matrix parseFactor(const string &str, int &idx){ if(str[idx] == '-'){ idx++; return mul(parseFactor(str, idx), Matrix(1,vector(1,MOD-1))); } return parsePrimary(str, idx); } Matrix parsePrimary(const string &str, int &idx){ Matrix res; res.clear(); if(isdigit(str[idx])){ int val = 0; while(isdigit(str[idx])) val = 10*val+str[idx++]-'0'; res.push_back(vector(1,val)); } else if(isupper(str[idx])){ res = mem[str[idx++]-'A']; } else if(str[idx]=='['){ idx++; res = parseRowseq(str, idx); idx++; } else if(str[idx]=='('){ idx++; res = parseExpr(str, idx); idx++; } while(true){ if(str[idx]=='\''){ idx++; res = trans(res); } else if(str[idx]=='('){ idx++; Matrix P1 = parseExpr(str, idx); idx++; Matrix P2 = parseExpr(str, idx); idx++; res = primary(res, P1, P2); } else break; } return res; } Matrix parseRowseq(const string &str, int &idx){ Matrix res; int x = 0; while(true){ Matrix tmp = parseExpr(str, idx); pushMatrix(res, tmp, x); if(str[idx]==';') x = res.size(); if(str[idx]==']') break; idx++; } return res; } int main(){ int n; ifstream fin("J.in"); while(fin >> n, n){ string str; getline(fin, str); for(int i=0;i