// gcc -O3 -o ch_tan ch_tan.c #include #include #include #include #include #include #include int morph[6][312] = { {0,1,0,2,0,1,3,2,1,0,2,1,2,3,1,2,0,1,2,1,3,0,2,0,1,0,3,1,0,1,2,0,3,0,1,3,0,3,2,1,3,1,0,3,1,3,2,3,0,1,0,3,0,2,1,3,0,3,2,0,3,1,2,0,2,3,0,2,0,1,0,3,2,1,2,0,1,2,3,1,2,1,0,2,1,3,2,0,1,0,2,0,3,1,2,0,1,2,1,3,0,2,1,2,3,2,1,0,1,3,1,2,0,3,0,1,3,0,2,3,0,3,1,0,3,2,0,1,3,1,0,1,2,3,0,1,0,2,1,0,3,2,1,2,0,2,1,3,0,1,2,0,1,0,3,1,0,2,1,0,1,3,2,0,2,1,2,3,0,3,2,3,0,1,0,2,0,3,1,2,1,0,2,1,3,2,1,2,0,1,2,3,1,0,2,0,1,0,3,2,1,0,2,1,2,3,0,1,2,1,3,1,2,0,3,2,1,3,2,3,0,2,3,1,2,3,2,0,1,3,1,2,1,0,3,0,1,0,3,2,3,1,3,0,2,1,2,3,1,2,0,1,2,1,3,2,1,0,2,3,1,3,2,3,0,1,2,3,2,0,3,2,1,0,3,0,2,3,0,3,1,3,2,0,1,0,3,1,0,2,1,0,1,3,0,1,2,0,3,1,3,0,3,2,1,0,3,1,0,1,2,3}, {0,1,0,2,0,1,3,1,2,1,0,3,2,3,1,3,0,2,1,2,3,2,0,1,0,2,0,3,1,2,0,2,3,0,2,1,3,0,3,2,0,3,0,1,0,2,3,1,3,0,1,3,2,1,3,1,0,3,1,2,3,0,1,0,3,0,2,1,3,0,1,3,1,2,0,3,1,3,2,3,1,0,1,2,1,3,0,2,0,1,2,0,3,2,0,2,1,0,2,3,0,1,2,1,0,1,3,2,0,1,0,3,1,0,2,3,1,3,0,3,1,2,0,1,3,0,1,0,2,1,0,3,1,0,1,2,3,0,3,1,3,2,1,3,1,0,3,2,3,1,2,3,2,0,1,2,1,3,2,1,2,0,2,3,1,3,2,3,0,1,2,3,2,0,3,2,1,0,3,0,2,0,3,1,2,3,0,2,3,2,1,3,2,0,3,2,3,1,0,2,0,3,0,1,2,1,0,1,2,3,2,0,2,1,3,0,3,2,0,3,1,0,3,0,2,3,0,1,3,2,0,2,3,2,1,0,3,2,0,3,0,1,2,3,0,3,1,3,0,2,0,1,0,3,2,1,2,0,2,3,1,3,2,3,0,1,2,3,2,0,3,2,1,0,3,0,2,3,0,3,1,3,2,0,1,0,3,1,0,2,1,0,1,3,0,1,2,0,3,1,3,0,3,2,1,0,3,1,0,1,2,3}, {0,1,0,2,0,1,3,1,2,1,0,3,2,3,1,3,0,2,0,3,0,1,2,3,0,3,1,0,3,2,1,0,1,3,1,0,2,3,0,1,3,0,3,2,0,3,1,0,3,0,2,1,3,1,0,1,2,0,1,0,3,1,2,1,0,2,1,2,3,0,2,0,1,2,0,2,3,2,1,0,1,2,1,3,0,2,1,2,3,1,2,0,3,1,3,2,1,3,1,0,1,2,3,0,3,1,0,3,2,0,3,0,1,3,0,2,3,1,0,1,3,1,2,0,3,1,0,3,0,2,1,3,0,3,2,3,0,1,0,2,0,3,1,2,1,0,1,3,2,0,2,1,2,3,0,3,2,3,1,0,2,3,2,1,3,2,0,1,3,1,2,3,1,3,0,3,2,1,0,1,3,0,1,2,0,1,0,3,1,0,2,1,3,0,3,1,3,2,0,1,3,0,1,0,2,3,1,0,1,2,1,0,3,0,2,0,1,3,2,3,0,2,3,1,2,3,2,0,3,2,1,3,0,2,0,3,0,1,2,3,0,3,1,0,3,2,1,0,1,3,1,0,2,3,0,1,3,0,3,2,0,3,1,0,3,0,2,1,3,1,0,1,2,3,2,1,2,3,0,3,1,3,2,0,1,0,3,1,0,2,1,0,1,3,0,1,2,0,3,1,3,0,3,2,1,0,3,1,0,1,2,3}, {0,1,0,2,0,1,3,1,2,1,0,3,2,3,1,3,0,2,0,3,0,1,2,3,0,3,1,0,3,2,1,0,1,3,0,1,0,2,0,3,1,2,1,0,2,1,3,2,1,2,0,1,2,3,1,0,2,0,1,0,3,2,1,0,2,1,2,3,0,1,2,1,3,1,2,0,2,3,2,1,0,3,0,2,3,0,1,3,0,3,2,0,3,1,0,2,3,2,0,2,1,3,0,2,3,0,3,1,2,0,3,0,1,0,3,2,3,1,3,0,2,1,2,3,2,0,1,3,1,2,1,0,3,0,1,0,2,3,1,0,1,2,0,1,3,2,0,2,1,0,2,0,3,0,1,2,3,2,0,3,2,1,3,2,3,0,2,3,1,2,0,3,0,2,0,1,3,2,0,3,2,3,1,0,2,3,2,1,2,3,0,1,3,2,1,3,1,0,3,1,2,3,1,3,0,2,1,2,3,2,0,1,0,2,0,1,3,1,2,1,0,3,2,3,1,2,3,0,2,3,2,1,3,2,0,3,1,2,1,3,1,0,2,3,1,2,3,2,0,1,3,2,3,0,3,2,1,2,0,2,3,0,2,0,1,2,3,2,0,3,2,3,1,0,3,0,2,3,0,3,1,3,2,0,1,0,3,1,0,2,1,0,1,3,0,1,2,0,3,1,3,0,3,2,1,0,3,1,0,1,2,3}, {0,1,0,2,0,1,3,1,2,1,0,2,1,2,3,1,0,1,2,0,1,0,3,2,0,2,1,0,2,0,3,0,1,2,3,2,0,3,2,1,3,2,3,0,2,3,1,2,0,3,0,2,0,1,3,2,0,3,2,3,1,0,2,3,2,1,2,3,0,3,1,3,2,0,1,0,3,0,2,1,2,0,2,3,1,0,2,0,3,2,0,1,3,2,3,0,2,3,2,1,2,0,3,1,3,2,1,3,0,1,3,1,2,3,1,0,3,2,1,2,3,2,0,1,3,2,1,3,1,0,2,3,1,3,0,3,1,2,1,0,1,3,2,0,2,1,0,2,3,0,2,0,1,2,0,3,2,1,0,1,2,1,3,0,2,1,0,2,0,3,1,2,0,2,3,2,0,1,0,3,0,2,1,3,1,0,1,2,3,0,3,1,3,2,0,2,3,2,1,0,3,2,3,1,2,3,0,1,2,1,3,1,2,0,3,2,1,3,2,3,0,2,3,1,2,3,2,0,1,3,1,2,1,0,3,0,1,0,3,2,3,1,3,0,2,1,2,3,1,2,0,1,2,1,3,2,1,0,2,3,1,3,2,3,0,1,2,3,2,0,3,2,1,0,3,0,2,0,3,1,2,3,0,2,3,2,1,3,2,0,3,2,3,1,0,2,0,3,0,1,3,0,3,2,1,0,3,1,0,1,2,3}, {0,1,0,2,0,1,3,1,2,1,0,2,1,2,3,1,0,1,2,0,1,0,3,2,0,2,1,0,2,0,3,0,1,2,3,2,0,3,2,1,3,2,3,0,2,3,1,2,0,3,0,2,0,1,3,2,0,2,1,0,2,3,1,0,1,2,0,1,0,3,0,2,1,3,1,0,3,1,2,3,1,3,0,1,3,2,1,0,3,0,1,0,2,3,1,0,3,1,3,2,0,1,3,1,2,1,3,0,2,3,1,2,3,2,0,3,2,1,3,2,3,0,1,2,1,3,1,0,2,0,1,0,2,3,2,1,2,0,3,1,3,2,1,3,0,1,3,1,2,3,1,0,3,2,1,2,3,2,0,1,3,2,1,3,1,0,2,3,1,3,0,3,1,2,0,1,3,0,1,0,2,1,0,3,1,0,1,2,3,0,3,1,3,2,0,2,3,2,0,1,0,3,0,2,1,3,1,0,3,1,2,3,1,3,0,1,3,2,1,0,3,0,1,0,2,3,1,0,1,2,0,1,3,2,0,2,1,2,0,3,1,0,2,1,0,1,3,0,1,2,0,1,0,3,2,1,2,0,2,3,1,3,2,3,0,1,2,3,2,0,3,2,1,0,3,0,2,0,3,1,2,3,0,2,3,2,1,3,2,0,3,2,3,1,0,2,0,3,0,1,3,0,3,2,1,0,3,1,0,1,2,3}}; int i, l, a, b, lim, mot[1000000]; void date(){ fflush(stdout); system("date \"+\%d/\%m/\%Y \%H/\%M/\%S\""); } int sum(int *m, int i, int k){ int s, abss[4], l = i+1; *abss = abss[1] = abss[2] = abss[3] = 0; for(s = 0; s < k; s++) abss[m[l-2*k+s]]++; for(s = 0; s < k; s++) abss[m[l-k+s]]--; return !(*abss) && !abss[1] && !abss[2]; } int eq(int *g, int *d, int l){ for(; l--; ) if(g[l] != d[l]) return 0; return 1; } int abacbdcd(int *m, int i){ int a, b, c, d, l = i+1; for(d = 1; 6+2*d <= l; d++) for(c = 1; 4+2*c+2*d <= l; c++) if(eq(m+l-c-2*d, m+l-d, d)) for(b = 1; 2+2*b+2*c+2*d <= l; b++) if(eq(m+l-b-2*c-2*d, m+l-c-d, c)) for(a = 1; 2*a+2*b+2*c+2*d <= l; a++) if(eq(m+l-a-2*b-2*c-2*d, m+l-b-c-2*d, b) && eq(m+l-2*a-2*b-2*c-2*d, m+l-a-b-2*c-2*d, a)) return 0; return 1; }//*/ int abacdbdc(int *m, int i){ int a, b, c, d, l = i+1; for(c = 1; 6+2*c <= l; c++) for(d = 1; 4+2*c+2*d <= l; d++) for(b = 1; 2+2*b+2*c+2*d <= l; b++) if(eq(m+l-b-2*c-2*d, m+l-c, c) && eq(m+l-b-c-2*d, m+l-c-d, d)) for(a = 1; 2*a+2*b+2*c+2*d <= l; a++) if(eq(m+l-a-2*b-2*c-2*d, m+l-b-c-d, b) && eq(m+l-2*a-2*b-2*c-2*d, m+l-a-b-2*c-2*d, a)) return 0; return 1; }//*/ int abcacdbd(int *m, int i){ int a, b, c, d, l = i+1; for(d = 1; 6+2*d <= l; d++) for(b = 1; 4+2*b+2*d <= l; b++) if(eq(m+l-b-2*d, m+l-d, d)) for(c = 1; 2+2*b+2*c+2*d <= l; c++) for(a = 1; 2*a+2*b+2*c+2*d <= l; a++) if(eq(m+l-a-b-2*c-2*d, m+l-b-c-2*d, c) && eq(m+l-a-2*b-2*c-2*d, m+l-b-d, b) && eq(m+l-2*a-2*b-2*c-2*d, m+l-a-b-c-2*d, a)) return 0; return 1; }//*/ int abacdcbd(int *m, int i){ int a, b, c, d, l = i+1; for(d = 1; 6+2*d <= l; d++) for(b = 1; 4+2*b+2*d <= l; b++) for(c = 1; 2+2*b+2*c+2*d <= l; c++) if(eq(m+l-b-2*c-2*d, m+l-b-c-d, c) && eq(m+l-b-c-2*d, m+l-d, d)) for(a = 1; 2*a+2*b+2*c+2*d <= l; a++) if(eq(m+l-a-2*b-2*c-2*d, m+l-b-d, b) && eq(m+l-2*a-2*b-2*c-2*d, m+l-a-b-2*c-2*d, a)) return 0; return 1; }//*/ int abcadbdc(int *m, int i){ int a, b, c, d, l = i+1; for(c = 1; 6+2*c <= l; c++) for(d = 1; 4+2*c+2*d <= l; d++) for(b = 1; 2+2*b+2*c+2*d <= l; b++) if(eq(m+l-b-c-2*d, m+l-c-d, d)) for(a = 1; 2*a+2*b+2*c+2*d <= l; a++) if(eq(m+l-a-b-2*c-2*d, m+l-c, c) && eq(m+l-a-2*b-2*c-2*d, m+l-b-c-d, b) && eq(m+l-2*a-2*b-2*c-2*d, m+l-a-b-c-2*d, a)) return 0; return 1; }//*/ int abcadcbd(int *m, int i){ int a, b, c, d, l = i+1; for(d = 1; 6+2*d <= l; d++) for(b = 1; 4+2*b+2*d <= l; b++) for(c = 1; 2+2*b+2*c+2*d <= l; c++) if(eq(m+l-b-c-2*d, m+l-d, d)) for(a = 1; 2*a+2*b+2*c+2*d <= l; a++) if(eq(m+l-a-b-2*c-2*d, m+l-b-c-d, c) && eq(m+l-a-2*b-2*c-2*d, m+l-b-d, b) && eq(m+l-2*a-2*b-2*c-2*d, m+l-a-b-c-2*d, a)) return 0; return 1; }//*/ int abcadcdb(int *m, int i){ int a, b, c, d, l = i+1; for(b = 1; 6+2*b <= l; b++) for(d = 1; 4+2*b+2*d <= l; d++) for(c = 1; 2+2*b+2*c+2*d <= l; c++) if(eq(m+l-b-c-2*d, m+l-b-d, d)) for(a = 1; 2*a+2*b+2*c+2*d <= l; a++) if(eq(m+l-a-b-2*c-2*d, m+l-b-c-d, c) && eq(m+l-a-2*b-2*c-2*d, m+l-b, b) && eq(m+l-2*a-2*b-2*c-2*d, m+l-a-b-c-2*d, a)) return 0; return 1; }//*/ int abcbadcd(int *m, int i){ int a, b, c, d, l = i+1; for(d = 1; 6+2*d <= l; d++) for(c = 1; 4+2*c+2*d <= l; c++) if(eq(m+l-c-2*d, m+l-d, d)) for(a = 1; 2*a+2+2*c+2*d <= l; a++) for(b = 1; 2*a+2*b+2*c+2*d <= l; b++) if(eq(m+l-2*a-2*b-2*c-2*d, m+l-a-c-2*d, a) && eq(m+l-a-2*b-2*c-2*d, m+l-a-b-c-2*d, b) && eq(m+l-a-b-2*c-2*d, m+l-c-d, c)) return 0; return 1; }//*/ int abcbdacd(int *m, int i){ int a, b, c, d, l = i+1; for(d = 1; 6+2*d <= l; d++) for(c = 1; 4+2*c+2*d <= l; c++) for(a = 1; 2*a+2+2*c+2*d <= l; a++) if(eq(m+l-a-c-2*d, m+l-d, d)) for(b = 1; 2*a+2*b+2*c+2*d <= l; b++) if(eq(m+l-2*a-2*b-2*c-2*d, m+l-a-c-d, a) && eq(m+l-a-2*b-2*c-2*d, m+l-a-b-c-2*d, b) && eq(m+l-a-b-2*c-2*d, m+l-c-d, c)) return 0; return 1; }//*/ int abcbdcad(int *m, int i){ int a, b, c, d, l = i+1; for(d = 1; 6+2*d <= l; d++) for(a = 1; 4+2*a+2*d <= l; a++) for(c = 1; 2+2*a+2*c+2*d <= l; c++) if(eq(m+l-a-c-2*d, m+l-d, d)) for(b = 1; 2*a+2*b+2*c+2*d <= l; b++) if(eq(m+l-a-b-2*c-2*d, m+l-a-c-d, c) && eq(m+l-a-2*b-2*c-2*d, m+l-a-b-c-2*d, b) && eq(m+l-2*a-2*b-2*c-2*d, m+l-a-d, a)) return 0; return 1; }//*/ int abcbdadc(int *m, int i){ int a, b, c, d, l = i+1; for(c = 1; 6+2*c <= l; c++) for(d = 1; 4+2*c+2*d <= l; d++) for(a = 1; 2+2*a+2*c+2*d <= l; a++) if(eq(m+l-a-c-2*d, m+l-c-d, d)) for(b = 1; 2*a+2*b+2*c+2*d <= l; b++) if(eq(m+l-a-2*b-2*c-2*d, m+l-a-b-c-2*d, b) && eq(m+l-2*a-2*b-2*c-2*d, m+l-a-c-d, a) && eq(m+l-a-b-2*c-2*d, m+l-c, c)) return 0; return 1; }//*/ int abcdacbd(int *m, int i){ int abcd, a, b, c, d, l = i+1; for(abcd = 4; 2*abcd <= l; abcd++) if(sum(m, i, abcd)) for(d = 1; d+3 <= abcd && m[l-abcd-d] == m[l-d]; d++) for(a = 1; a+d+2 <= abcd && m[i-2*abcd+a] == m[i-abcd+a]; a++) for(b = 1, c = abcd-a-d-1; c; b++, c--) if(eq(m+l-2*abcd+a, m+l-d-b, b) && eq(m+l-abcd-d-c, m+l-abcd+a, c)) return 0; return 1; } int abcdadcb(int *m, int i){ int abcd, a, b, c, d, l = i+1; for(abcd = 4; 2*abcd <= l; abcd++) if(sum(m, i, abcd)) for(a = 1; a <= abcd-3 && m[i-2*abcd+a] == m[i-abcd+a]; a++) for(d = 1; a+d+2 <= abcd; d++) if(eq(m+l-abcd-d, m+l-abcd+a, d)) for(b = 1, c = abcd-a-d-1; c; b++, c--) if(eq(m+l-2*abcd+a, m+l-b, b) && eq(m+l-abcd-d-c, m+l-b-c, c)) return 0; return 1; } int abcdcbad(int *m, int i){ int abcd, a, b, c, d, l = i+1; for(abcd = 4; 2*abcd <= l; abcd++) if(sum(m, i, abcd)) for(d = 1; d+3 <= abcd && m[l-abcd-d] == m[l-d]; d++) for(a = 1; a+d+2 <= abcd; a++) if(eq(m+l-2*abcd, m+l-a-d, a)) for(b = 1, c = abcd-d-a-1; c; b++, c--) if(eq(m+l-2*abcd+a, m+l-abcd+c, b) && eq(m+l-abcd-c-d, m+l-abcd, c)) return 0; return 1; } int abcdbadc(int *m, int i){ int abcd, a, b, c, d, l = i+1; for(abcd = 4; 2*abcd <= l; abcd++) if(sum(m, i, abcd)) for(a = 1; a+3 <= abcd; a++) for(b = 1; a+b+2 <= abcd && m[i-2*abcd+a+b] == m[i-abcd+b]; b++) if(eq(m+l-2*abcd, m+l-abcd+b, a)) for(c = 1, d = abcd-a-b-1; d; c++, d--) if(eq(m+l-2*abcd+a+b, m+l-c, c) && eq(m+l-abcd-d, m+l-c-d, d)) return 0; return 1; } int abcdbdac(int *m, int i){ int abcd, a, b, c, d, l = i+1; for(abcd = 4; 2*abcd <= l; abcd++) if(sum(m, i, abcd)) for(a = 1; a+3 <= abcd; a++) for(b = 1; a+b+2 <= abcd && m[i-2*abcd+a+b] == m[i-abcd+b]; b++) for (c = 1, d = abcd-a-b-1; d; c++, d--) if(eq(m+l-2*abcd, m+l-a-c, a) && eq(m+l-abcd-c-d, m+l-c, c) && eq(m+l-abcd-d, m+l-abcd+b, d)) return 0; return 1; } int abcdcadb(int *m, int i){ int abcd, a, b, c, d, l = i+1; for(abcd = 4; 2*abcd <= l; abcd++) if(sum(m, i, abcd)) for(b = 1; b+3 <= abcd; b++) for(d = 1; b+d+2 <= abcd; d++) for(a = 1, c = abcd-b-d-1; c; a++, c--) if(eq(m+l-2*abcd, m+l-a-b-d, a) && eq(m+l-2*abcd+a, m+l-b, b) && eq(m+l-abcd-c-d, m+l-abcd, c) && eq(m+l-abcd-d, m+l-b-d, d)) return 0; return 1; } int abacbc(int *m, int i){ int a, b, c, l = i+1; for(c = 1; 4+2*c <= l; c++) for(b = 1; 2+2*b+2*c <= l; b++) if(eq(m+l-b-2*c, m+l-c, c)) for(a = 1; 2*a+2*b+2*c <= l; a++) if(eq(m+l-2*a-2*b-2*c, m+l-a-b-2*c, a) && eq(m+l-a-2*b-2*c, m+l-b-c, b)) return 0; return 1; }//*/ int abcacb(int *m, int i){ int abc, a, b, c, l = i+1; for(abc = 3; 2*abc <= l; abc++) if(sum(m, i, abc)) for(a = 1; (a < abc-1) && (m[i-2*abc+a] == m[i-abc+a]); a++) for(b = 1; b < abc-a ; b++) if(eq(m+l-2*abc+a, m+l-b, b) && eq(m+l-2*abc+a+b, m+l-abc+a, abc-a-b)) return 0; return 1; }//*/ int abcbac(int *m, int i){ int abc, a, b, c, l = i+1; for(abc = 3; 2*abc <= l; abc++) if(sum(m, i, abc)) for(c = 1; (c < abc-1) && (m[l-c] == m[l-abc-c]); c++) for(a = 1, b = abc-1-c; b >= 1; a++, b--) if(eq(m+l-2*abc, m+l-a-c, a) && eq(m+l-2*abc+a, m+l-abc, b)) return 0; return 1; }//*/ int aa(int *m, int i){ int a, l = i+1; for(a = 1; 2*a <= l; a++) if(eq(m+l-2*a, m+l-a, a)) return 0; return 1; }//*/ int tang(int *m, int i){ return aa(m, i) && abacbc(m, i) && abcacb(m, i) && abcbac(m, i) && abacbdcd(m, i) && abacdbdc(m, i) && abacdcbd(m, i) && abcacdbd(m, i) && abcadbdc(m, i) && abcadcbd(m, i) && abcadcdb(m, i) && abcbadcd(m, i) && abcbdacd(m, i) && abcbdadc(m, i) && abcbdcad(m, i) && abcdacbd(m, i) && abcdadcb(m, i) && abcdbadc(m, i) && abcdbdac(m, i) && abcdcadb(m, i) && abcdcbad(m, i); } void usage(){ printf("Usage: ch_tan l\n"); exit(0); } int main(int ac, char **av){ if(ac != 2) usage(); l = atoi(av[1]); for(a = 0; a < 6; a++) for(b = 0; b < 6; b++){ for(i = 0; i < 312; i++) mot[i] = morph[a][i]; for(i = 0; i < 312; i++) mot[312+i] = morph[b][i]; for(i = 0; i < 624-l; i++) if(!tang(mot+i, l-1)) { printf("non\n"); return 0; } } printf("OK\n"); return 1; }