// gcc -O3 -o tryt tryt.c #include #include #include int m[1000], i, n, d, p, c; int ceiling(int a, int b){ return (a+b-1)/b; } int rep(int *m, int i, int n, int d, int plus){ int y, z, lon; for(lon = 1; (z = ceiling(lon*n+plus, d)) <= i+1; lon++){ for(y = i-lon; (y >= 0) && (m[y] == m[y+lon]); y--); if(i-y >= z) return 0; } return 1; } int eq(int *g, int *d, int l){ for(; l--; ) if(g[l] != d[l]) return 0; return 1; } int ispal(int *m, int x, int y){ for(; x < y && m[x] == m[y]; x++, y--); return x >= y; } int pp(){ int x, y, z, w = 1; if(!rep(m, i, n, d, p)) return 0; for(x = 0; x <= i; x++) for(y = x; y <= i && y-x < 2*c; y++) if(ispal(m, x, y)){ for(z = 0; z < x && !eq(m+z, m+x, y-x+1); z++); if(z == x && ++w > c) return 0; } return 1; } void usage(){ printf("./tryt c n d p\n"); exit(0); } void main(int ac, char **av){ if(ac != 5) usage(); c = atoi(av[1]); n = atoi(av[2]); d = atoi(av[3]); p = atoi(av[4]); for(*m = i = 0; i < 1000;) if(pp()) m[++i] = 0; else{ while(m[i] == 2) if(!(--i)) goto here; m[i]++; } printf("a word of length 1000 has been obtained\n"); return; here: printf("backtracking finishes\n"); }