#include"lib.h" int mot[MAX], cl[MAX], up[MAX], code[1000], mot2[1000000], k, t, size, i, nb, mnb, pos, s, x; int64_t a, b, c, d, nx, ny, nd; char prog[100]; int ok(){ if(mnb < (nb = (i+1)/size)) {printf("nb=%d", mnb = nb); date("");} for(k = s = 0; k < size; k++) s += (mot[k+(nb-1)*size] == 2); if(s != t*nx) return 0; for(k = s = 0; k < size; k++) s += (mot[k+(nb-1)*size] == 1); if(s != t*ny) return 0; if(nb == 1) return 1; //for(k = 0; k < size; k++) // if(mot[k+(nb-2)*size] > mot[k+(nb-1)*size]) break; // else if(mot[k+(nb-2)*size] < mot[k+(nb-1)*size]){ i -= size; return 0;}//*/ for(*code = x = 0; ;) if(!sqf(code, x)){ ici: while(code[x] == nb-1) if(!x--) return 1; code[x]++; }else{ s = nb-1-code[x];//optimized version //s = code[x];//old version for(k = 0; k < size; k++){ mot2[pos = k+x*size] = mot[k+s*size]; if(x && !sqf(mot2, pos)) return 0; } if(x == 2) goto ici; else code[++x] = 0; } } int A(){ size = t*nd; mnb = nb = 0; printf("size=%d", size); date(""); for(i = 0; i < MAX; i++) up[i] = (b*c*(i+30))/d; for(i = 0; i < MAX; i++) if(up[i] < 0) {printf("NEGATIF i=%d\n", i); break;} for(*cl = *mot = i = 0; ;) if(cl[i] > up[i] || !sqf(mot, i)){ here: while(mot[i] == 2) if(!i--) return 1; cl[i] += (mot[i]++ ? b-a : a); }else if(!((i+1)%size)) if(!ok()) goto here; else if(nb == 3) break; else goto there; else{ there: mot[++i] = 0; cl[i] = cl[i-1]; } for(x = 0; x < 3; x++, printf("\n")) for(k = 0; k < size; k++) printf("%d", mot[k+x*size]); printf("OK size=%d a/b=%.10f", size, 1.0*a/b); date(""); return 0; } void usage(){ printf("Usage: unequal a b nx ny nd\n"); exit(0); } int main(int ac, char **av){ if(ac != 6) usage(); a = atoll(av[1]); b = atol(av[2]); nx = atoll(av[3]); ny = atoll(av[4]); nd = atoll(av[5]); c = (b-a)*nx+a*ny; d = b*nd; //c = (b-a)*nx+a*ny+d/8; printf("a/b=%.10f c/d=%.10f nx/nd=%.10f ny/nd=%.10f\n", 1.0*a/b, 1.0*c/d, 1.0*nx/nd, 1.0*ny/nd); for(t = 1; A(); t++); } /* serveur6:~/mots/code$ ./unequal 25 50 100 7 8 24 size=24: 18/04/2007 09/57/47 nb=1: 18/04/2007 09/57/47 nb=2: 18/04/2007 09/57/47 nb=3: 18/04/2007 09/57/47 size=48: 18/04/2007 09/57/48 nb=1: 18/04/2007 09/57/48 nb=2: 18/04/2007 09/57/48 nb=3: 18/04/2007 09/59/48 010201202101201020121012021020102101201020121012 010210120210201021012010201210201021201020121012 010210121020102101201020120210201021201020121012 OK size=48 a/b=0.3600000000 ./tmp.txt: 18/04/2007 09/59/48 serveur6:~/mots/code$ ./unequal 9 25 41 100 20 23 69 size=69: 19/04/2007 14/26/01 nb=1: 19/04/2007 14/26/01 nb=2: 19/04/2007 14/26/01 nb=3: 19/04/2007 14/26/01 010201202101201021012102010210120102012101202102010210120102012021012 010210121020102101201020120210201021012010201210201021012010212021012 010210121020102101201020120210201021012010201210201021012021020121012 OK size=69 a/b=0.3600000000 ./tmp.txt: 19/04/2007 14/26/02 serveur6:~/mots/code$ ./unequal 9 25 41 100 13 15 45 size=45: 19/04/2007 14/36/46 nb=1: 19/04/2007 14/36/46 nb=2: 19/04/2007 14/36/47 nb=3: 19/04/2007 14/36/47 size=90: 19/04/2007 14/36/47 nb=1: 19/04/2007 14/36/47 nb=2: 19/04/2007 14/36/47 nb=3: 19/04/2007 14/36/47 010201202101201020121012010210121020102101201020120210120102101202102010210120102012021012 010210121020102101201020120210201021012010201210120102101202102010210120102012021020121012 010210121020102101201020120210201021012010201210201021012021020102101210201021201020121012 OK size=90 a/b=0.3600000000 ./tmp.txt: 19/04/2007 14/36/47 serveur6:~/mots/code$ ./unequal 3 10 39 100 16 19 56 a/b=0.3000000000 c/d=0.3900000000 nx/nd=0.2857142857 ny/nd=0.3392857143 size=56: 19/04/2007 15/07/26 nb=1: 19/04/2007 15/07/26 nb=2: 19/04/2007 15/07/26 nb=3: 19/04/2007 15/07/26 size=112: 19/04/2007 15/07/27 nb=1: 19/04/2007 15/07/27 nb=2: 19/04/2007 15/07/27 nb=3: 19/04/2007 15/07/28 0102012101201020120210120102012101201021012102010210120102012021012010210120210201021012010201202101201021012102 0102101201020120210201021012010201210120102101210201021012010201202101201021012102010210120102012102010210120212 0102101201020121012010210120210201021012010201210120102101210201021012010201202102010210120102012102010210120212 OK size=112 a/b=0.3000000000: 19/04/2007 15/14/30 */