#include int ceilingsqrt(int x) { int r = 0; while (r*r < x) r++; return r; } int nr_sol; int solution[6]; int solve(int n, int l, int a, int c) { int det = -7*(a*a + c*c) + 2*a*c + 2*n*(a + c) + n*n - 8*l; if (det >= 0) { int sdet = ceilingsqrt(det); if (sdet*sdet == det) { int b_f = 6*n - 10*(a + c); for (int sign = det == 0 ? 1 : -1; sign <= 1; sign += 2) { int denom = -b_f + sign * 2 * sdet; if (denom % 16 == 0) { int b = denom / -16; int d = n - a - 2*b - 2*c; int e = -n + 2*a + 3*b + 2*c; int f = n - 2*a - 2*b - c; if (a + b + c + d + e + f != n || a*b + b*c + a*c + d*e + e*f + d*f != l) printf("ERROR"); solution[0] = a; solution[1] = b; solution[2] = c; solution[3] = d; solution[4] = e; solution[5] = f; nr_sol++; } } } } return det >= 0; } int main(int argc, char *argv[]) { int k = -1; int n = 6; for (int nr_hexa = 1; nr_hexa < 1000000; nr_hexa++) { printf("%d: ", nr_hexa); int extra; int nr_min_perm = ceilingsqrt(12*nr_hexa - 3) - 3; int nr_triangle = 2*(nr_hexa - 1) - nr_min_perm; int new_n = -1; nr_sol = 0; if (n == 6 && 6*(k + 1)*(k + 1) == nr_triangle) { printf("6k^2 "); k++; n = nr_hexa == 1 ? 2 : 1; new_n = n; for (int i = 0; i < 6; i++) solution[i] = 0; nr_sol = 1; } else { for (extra = 0; extra < 10; extra++) { int n_e = n + extra; int l_e = nr_triangle - (6*k*k + 2*n_e*k + extra); int go = 1; for (int w = 0; go && nr_sol == 0; w++) { go = 0; for (int a = -w; a < w && nr_sol == 0; a++) if (solve(n_e, l_e, a, w)) go = 1; for (int c = -w; c <= w && nr_sol == 0; c++) if (solve(n_e, l_e, w, c)) go = 1; } //equation_for(n_e, nr_triangle - (6*k*k + 2*(n+extra)*k + extra)); if (nr_sol > 0) { printf("6k^2 + %dk ", 2*n_e); if (l_e < 0) printf("- %d ", -l_e); else if (l_e > 0) printf("+ %d ", l_e); else printf(" "); break; } } if (n < 6 && nr_triangle == 6*k*k + 2*n*k + n - 2) { n++; new_n = n; } } if (nr_sol == 0) printf("No solutions"); else for (int i = 0; i < 6; i++) printf("%4d", solution[i]); printf(" (%d %d)", nr_min_perm + 6, nr_triangle); if (extra > 0) printf(" EXTRA=%d ", extra); printf("\n"); if (new_n >= 0) printf(" (%d)\n", new_n); } }