#include <cstdio>
#include <vector>
using namespace std;
#define Nmax 8
int N;
int ts[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}};
struct plansza {bool P[Nmax][Nmax];
bool operator==(const plansza &P);
bool equals(plansza P);
plansza symH();
plansza rot90();
plansza rot180();
}P0;
vector<plansza> tp;
bool W[Nmax];
plansza P;
void show(const plansza &P);
bool ss(int w, int k);
void uws(int w, int k) {
if (W[w]) return;
if (!ss(w,k)) return;
W[w]=true;
P.P[w][k]=true;
if (k==N-1) {
bool same=false;
for (int i=0;!same && i<tp.size();++i) same=tp[i].equals(P);
if (!same)
tp.push_back(P);
}
else
for (int i=0;i<N;++i) uws(i,k+1);
W[w]=false;
P.P[w][k]=false;
}
int main() {
for (N=1;N<=Nmax;++N) {
tp.clear();
P=P0;
for (int i=0;i<N;++i)
uws(i,0);
printf("%d\t%d\n",N,tp.size());
//for(int i=0;i<tp.size();++i) {printf("%d\n",i);show(tp[i]);}
}
return 0;
}
void show(const plansza &P) {
for (int i=0;i<N;++i) {
for (int j=0;j<N;++j)
printf("%c",P.P[i][j]?'X':'o');
printf("\n");
}
printf("\n");
}
bool ss(int w, int k) {
bool ok=true;
for (int i=0;ok && i<8;++i) {
int x=w+ts[i][0]; if (x<0 || x>N-1) continue;
int y=k+ts[i][1]; if (y<0 || y>N-1) continue;
ok=!P.P[x][y];
}
return ok;
}
bool plansza::operator==(const plansza &Q) {
bool ok=true;
for (int i=0;ok && i<N;++i)
for (int j=0;ok &&j<N;++j)
ok=P[i][j]==Q.P[i][j];
return ok;
}
plansza plansza::symH() {
plansza P=*this;
for (int i=0;i<N;++i)
for (int j=0;j<(N+1)/2;++j) {
bool p=P.P[i][j];
P.P[i][j]=P.P[i][N-1-j];
P.P[i][N-1-j]=p;
}
return P;
};
plansza plansza::rot90() {
plansza Q;
for (int i=0;i<N;++i)
for (int j=0;j<N;++j)
Q.P[j][N-1-i]=P[i][j];
return Q;
}
plansza plansza::rot180() {
plansza Q;
for (int i=0;i<N;++i)
for (int j=0;j<N;++j)
Q.P[N-1-i][N-1-j]=P[i][j];
return Q;
}
bool plansza::equals(plansza P) {
if (*this==P.rot90()) return true;
if (*this==P.rot180()) return true;
if (P==this->rot90()) return true;
if (*this==P.symH()) return true;
P=P.symH();
if (*this==P.rot90()) return true;
if (*this==P.rot180()) return true;
if (P==this->rot90()) return true;
return false;
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPHZlY3Rvcj4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgTm1heCA4CmludCBOOwppbnQgdHNbOF1bMl09e3stMiwtMX0sey0yLDF9LHstMSwtMn0sey0xLDJ9LHsxLC0yfSx7MSwyfSx7MiwtMX0sezIsMX19OwoKc3RydWN0IHBsYW5zemEge2Jvb2wgUFtObWF4XVtObWF4XTsKICBib29sIG9wZXJhdG9yPT0oY29uc3QgcGxhbnN6YSAmUCk7CiAgYm9vbCBlcXVhbHMocGxhbnN6YSBQKTsKICBwbGFuc3phICBzeW1IKCk7CiAgcGxhbnN6YSAgcm90OTAoKTsKICBwbGFuc3phICByb3QxODAoKTsKICB9UDA7CnZlY3RvcjxwbGFuc3phPiB0cDsKYm9vbCBXW05tYXhdOwpwbGFuc3phIFA7Cgp2b2lkIHNob3coY29uc3QgcGxhbnN6YSAmUCk7CmJvb2wgc3MoaW50IHcsIGludCBrKTsKCnZvaWQgdXdzKGludCB3LCBpbnQgaykgewogIGlmIChXW3ddKSByZXR1cm47CiAgaWYgKCFzcyh3LGspKSByZXR1cm47CiAgV1t3XT10cnVlOwogIFAuUFt3XVtrXT10cnVlOwogIGlmIChrPT1OLTEpIHsKICAgIGJvb2wgc2FtZT1mYWxzZTsKICAgIGZvciAoaW50IGk9MDshc2FtZSAmJiBpPHRwLnNpemUoKTsrK2kpICBzYW1lPXRwW2ldLmVxdWFscyhQKTsKICAgIGlmICghc2FtZSkgCiAgICAgIHRwLnB1c2hfYmFjayhQKTsgCiAgICB9CiAgZWxzZQogICAgZm9yIChpbnQgaT0wO2k8TjsrK2kpIHV3cyhpLGsrMSk7CiAgV1t3XT1mYWxzZTsKICBQLlBbd11ba109ZmFsc2U7CiAgfQoKaW50IG1haW4oKSB7CmZvciAoTj0xO048PU5tYXg7KytOKSB7CiAgdHAuY2xlYXIoKTsKICBQPVAwOwogIGZvciAoaW50IGk9MDtpPE47KytpKSAgICAKICAgIHV3cyhpLDApOwogIHByaW50ZigiJWRcdCVkXG4iLE4sdHAuc2l6ZSgpKTsKICAvL2ZvcihpbnQgaT0wO2k8dHAuc2l6ZSgpOysraSkge3ByaW50ZigiJWRcbiIsaSk7c2hvdyh0cFtpXSk7fQogIH0KcmV0dXJuIDA7Cn0KCnZvaWQgc2hvdyhjb25zdCBwbGFuc3phICZQKSB7CiAgZm9yIChpbnQgaT0wO2k8TjsrK2kpIHsgCiAgICBmb3IgKGludCBqPTA7ajxOOysraikKICAgICAgcHJpbnRmKCIlYyIsUC5QW2ldW2pdPydYJzonbycpOwogICAgcHJpbnRmKCJcbiIpOwogICAgfQogIHByaW50ZigiXG4iKTsKICB9Cgpib29sIHNzKGludCB3LCBpbnQgaykgewogIGJvb2wgb2s9dHJ1ZTsgICAgCiAgZm9yIChpbnQgaT0wO29rICYmIGk8ODsrK2kpIHsKICAgIGludCB4PXcrdHNbaV1bMF07ICAgIGlmICh4PDAgfHwgeD5OLTEpIGNvbnRpbnVlOwogICAgaW50IHk9ayt0c1tpXVsxXTsgICAgaWYgKHk8MCB8fCB5Pk4tMSkgY29udGludWU7CiAgICBvaz0hUC5QW3hdW3ldOwogICAgfQogIHJldHVybiBvazsgICAgCiAgfQoKYm9vbCBwbGFuc3phOjpvcGVyYXRvcj09KGNvbnN0IHBsYW5zemEgJlEpIHsKICBib29sIG9rPXRydWU7ICAgIAogIGZvciAoaW50IGk9MDtvayAmJiBpPE47KytpKQogICAgZm9yIChpbnQgaj0wO29rICYmajxOOysraikKICAgICAgb2s9UFtpXVtqXT09US5QW2ldW2pdOwogIHJldHVybiBvazsgICAgCiAgfQoKcGxhbnN6YSBwbGFuc3phOjpzeW1IKCkgewogIHBsYW5zemEgUD0qdGhpczsKICBmb3IgKGludCBpPTA7aTxOOysraSkKICAgIGZvciAoaW50IGo9MDtqPChOKzEpLzI7KytqKSB7CiAgICAgIGJvb2wgcD1QLlBbaV1bal07CiAgICAgIFAuUFtpXVtqXT1QLlBbaV1bTi0xLWpdOwogICAgICBQLlBbaV1bTi0xLWpdPXA7CiAgICAgIH0KICByZXR1cm4gUDsgICAgICAKICB9OwogIApwbGFuc3phIHBsYW5zemE6OnJvdDkwKCkgewogIHBsYW5zemEgUTsKICBmb3IgKGludCBpPTA7aTxOOysraSkKICAgIGZvciAoaW50IGo9MDtqPE47KytqKQogICAgICAgUS5QW2pdW04tMS1pXT1QW2ldW2pdOwogIHJldHVybiBROwogIH0KCnBsYW5zemEgcGxhbnN6YTo6cm90MTgwKCkgewogIHBsYW5zemEgUTsKICBmb3IgKGludCBpPTA7aTxOOysraSkKICAgIGZvciAoaW50IGo9MDtqPE47KytqKQogICAgICAgUS5QW04tMS1pXVtOLTEtal09UFtpXVtqXTsKICByZXR1cm4gUTsKICB9Cgpib29sIHBsYW5zemE6OmVxdWFscyhwbGFuc3phIFApIHsKICAgIGlmICgqdGhpcz09UC5yb3Q5MCgpKSAgcmV0dXJuIHRydWU7CiAgICBpZiAoKnRoaXM9PVAucm90MTgwKCkpICByZXR1cm4gdHJ1ZTsKICAgIGlmIChQPT10aGlzLT5yb3Q5MCgpKSAgcmV0dXJuIHRydWU7CiAgICBpZiAoKnRoaXM9PVAuc3ltSCgpKSAgcmV0dXJuIHRydWU7CiAgICBQPVAuc3ltSCgpOwogICAgaWYgKCp0aGlzPT1QLnJvdDkwKCkpICByZXR1cm4gdHJ1ZTsKICAgIGlmICgqdGhpcz09UC5yb3QxODAoKSkgIHJldHVybiB0cnVlOwogICAgaWYgKFA9PXRoaXMtPnJvdDkwKCkpICByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKICAgIH0K