#include #include #include #include #define N (1024) #define Z(x,y) ((x) + (y) * n) #define X(z) ((z) % n) #define Y(z) ((z) / n) using namespace std; static int ff[N*N], *f = ff; static int gg[N*N], *g = gg; static int hh[N*N], *h = hh; static int n; int _rot(int x, int y) { return Z(y, n - 1 - x); } int _sym(int x, int y) { return Z(n - 1 - x, y); } int _bhsym(int x, int y) { if(y < n / 2) x = n - 1 - x; return Z(x, y); } int _bvsym(int x, int y) { if(y < n / 2) y = n / 2 - 1 - y; return Z(x, y); } int _div(int x, int y) { return Z(x, (y / 2) + (y % 2) * (n / 2)); } int _mix(int x, int y) { int n2 = n / 2; int x0 = (x % n2) * 2 + (y % 2); int y0 = (x / n2) + (y - y % 2); return Z(x0, y0); } void apply(string name) { int (*func)(int, int) = NULL; bool inv = false; if(name[name.length() - 1] == '-') { name = name.substr(0, name.length() - 1); inv = true; } if(name == "rot" ) func = _rot ; if(name == "sym" ) func = _sym ; if(name == "bhsym") func = _bhsym; if(name == "bvsym") func = _bvsym; if(name == "div" ) func = _div ; if(name == "mix" ) func = _mix ; if(func == NULL) return; for(int y = 0; y < n; y++) { for(int x = 0; x < n; x++) { int z0 = Z(x, y); int z1 = func(x, y); if(inv) g[z0] = f[z1]; else g[z1] = f[z0]; } } swap(f, g); } int cycle(int z0) { int z = z0; for(int k = 1; /* infinite */; k++) { z = f[z]; if(z == z0) return k; } } int power(int k) { swap(f, g); for(int i = 0; i < n * n; i++) f[i] = i; while(k > 1) { if((k & 1) == 1) { for(int i = 0; i < n * n; i++) f[i] = g[f[i]]; } for(int i = 0; i < n * n; i++) h[i] = g[g[i]]; swap(g, h); k >>= 1; } for(int i = 0; i < n * n; i++) f[i] = g[f[i]]; /* for(int y = 0; y < n; y++) { for(int x = 0; x < n; x++) { cout << "(" << X(f[Z(x,y)]) << "," << Y(f[Z(x,y)]) << ")"; } cout << endl; } */ } int main(void) { ifstream fin("pixel.in"); while(fin >> n, n) { for(int i = 0; i < n * n; i++) f[i] = i; string line; getline(fin, line); getline(fin, line); istringstream iss(line); vector verbs; string verb; while(iss >> verb) verbs.push_back(verb); for(int i = verbs.size() - 1; i >= 0; i--) apply(verbs[i]); int m = 1; for(int i = 0; i < n * n; i++) { int k = cycle(i); if(k > 1) { power(k); m *= k; } } cout << m << endl; } return 0; }