--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+/*
+ * observations:
+ *
+ * solutions of any length L starting at b have the sum
+ * S = L * (L-1 + 2b ) / 2
+ *
+ * This sum must equal the target t, so the base for a given length is
+ * t = L * (L-1+2b) / 2
+ * b = (2t/L-L+1)/2
+ *
+ * Since b must be an integer, t % ( (L+1)*L / 2 ) must equal 0
+ * 2t % L must be zero and
+ * 2t/L - L + 1 must be even
+ *
+ * With a minimum base of 1, the sum is (L+1)*L / 2,
+ * which must not exceed the target
+ * t >= (L+1)*L/2
+ * L <= (sqrt(8t+1)-1) / 2
+ *
+ * Even targets must have solution lengths >= 3
+ * even length solutions can start on any number
+ * odd length solutions must be centered on an even number
+ *
+ * Odd targets must have an odd number of odd numbers
+ * in the solution
+ * they always have an even length solution of t/2 + t/2 + 1
+ *
+ */
+int main(int ac, char *av[]) {
+ unsigned target; /* number to decompose */
+ unsigned sbase; /* lowest number in solution */
+ unsigned slen; /* N quantity of numbers in solution */
+ int oddtarget;
+ unsigned maxlen;
+
+ target = atoi(av[1]);
+
+ maxlen = (sqrt(8.0*target+1.0)-1) / 2;
+ oddtarget = target % 2;
+
+ if (oddtarget) {
+ printf("2 %d .. %d\n", target/2, target/2+1);
+ }
+
+ for (slen=3; slen <= maxlen; slen++) {
+ if (oddtarget && (slen % 2 == 0 && (slen/2 % 2 == 0))) {
+ continue;
+ }
+
+ if (2 * target % slen != 0) {
+ continue;
+ }
+ if ( (2 * target / slen - slen + 1) % 2 != 0) {
+ continue;
+ }
+
+ sbase = (2 * target / slen - slen + 1) / 2;
+
+ printf("%d %d .. %d\n", slen, sbase, sbase+slen-1);
+ }
+
+ return 0;
+}