import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.StringTokenizer;
int n = nextInt();
int[] grundy = new int[n + 1];
int[] seen = new int[n + 2];
int[] minMoves = new int[n + 1];
for (int i = 0; i <= n; ++i) {
for (int count = 2; count * (count + 1) / 2 <= i; ++count) {
int first = (i - (count * (count - 1)) / 2);
if (first % count != 0) continue;
first /= count;
int xor = 0;
for (int j = 0; j < count; ++j) xor ^= grundy[first + j];
seen[xor] = i;
if (xor
== 0) minMoves
[i
] = Math.
min(minMoves
[i
], count
); }
int j;
for (j = 0; seen[j] == i; ++j);
grundy[i] = j;
}
if (minMoves
[n
] == Integer.
MAX_VALUE) writer.println(-1);
else
writer.println(minMoves[n]);
for(int i = 0; i <= n; i++)
writer.println(grundy[i]);
}
public static void main
(String[] args
) { new Game().run();
}
public void run() {
try {
tokenizer = null;
solve();
reader.close();
writer.close();
e.printStackTrace();
}
}
return Integer.
parseInt(nextToken
()); }
return Long.
parseLong(nextToken
()); }
return Double.
parseDouble(nextToken
()); }
while (tokenizer == null || !tokenizer.hasMoreTokens()) {
}
return tokenizer.nextToken();
}
}
aW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwppbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKCnB1YmxpYyBjbGFzcyBHYW1lIGltcGxlbWVudHMgUnVubmFibGUgewogICAgcHJpdmF0ZSB2b2lkIHNvbHZlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBpbnQgbiA9IG5leHRJbnQoKTsKICAgICAgICBpbnRbXSBncnVuZHkgPSBuZXcgaW50W24gKyAxXTsKICAgICAgICBpbnRbXSBzZWVuID0gbmV3IGludFtuICsgMl07CiAgICAgICAgaW50W10gbWluTW92ZXMgPSBuZXcgaW50W24gKyAxXTsKICAgICAgICBBcnJheXMuZmlsbChtaW5Nb3ZlcywgSW50ZWdlci5NQVhfVkFMVUUpOwogICAgICAgIEFycmF5cy5maWxsKHNlZW4sIC0xKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBuOyArK2kpIHsKICAgICAgICAgICAgZm9yIChpbnQgY291bnQgPSAyOyBjb3VudCAqIChjb3VudCArIDEpIC8gMiA8PSBpOyArK2NvdW50KSB7CiAgICAgICAgICAgICAgICBpbnQgZmlyc3QgPSAoaSAtIChjb3VudCAqIChjb3VudCAtIDEpKSAvIDIpOwogICAgICAgICAgICAgICAgaWYgKGZpcnN0ICUgY291bnQgIT0gMCkgY29udGludWU7CiAgICAgICAgICAgICAgICBmaXJzdCAvPSBjb3VudDsKICAgICAgICAgICAgICAgIGludCB4b3IgPSAwOwogICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgKytqKSB4b3IgXj0gZ3J1bmR5W2ZpcnN0ICsgal07CiAgICAgICAgICAgICAgICBzZWVuW3hvcl0gPSBpOwogICAgICAgICAgICAgICAgaWYgKHhvciA9PSAwKSBtaW5Nb3Zlc1tpXSA9IE1hdGgubWluKG1pbk1vdmVzW2ldLCBjb3VudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW50IGo7CiAgICAgICAgICAgIGZvciAoaiA9IDA7IHNlZW5bal0gPT0gaTsgKytqKTsKICAgICAgICAgICAgZ3J1bmR5W2ldID0gajsKICAgICAgICB9CiAgICAgICAgaWYgKG1pbk1vdmVzW25dID09IEludGVnZXIuTUFYX1ZBTFVFKQogICAgICAgICAgICB3cml0ZXIucHJpbnRsbigtMSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtaW5Nb3Zlc1tuXSk7CiAgICAgICAgZm9yKGludCBpID0gMDsgaSA8PSBuOyBpKyspCiAgICAgICAgIHdyaXRlci5wcmludGxuKGdydW5keVtpXSk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIG5ldyBHYW1lKCkucnVuKCk7CiAgICB9CgogICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyOwogICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplcjsKICAgIFByaW50V3JpdGVyIHdyaXRlcjsKCiAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihTeXN0ZW0uaW4pKTsKICAgICAgICAgICAgdG9rZW5pemVyID0gbnVsbDsKICAgICAgICAgICAgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKFN5c3RlbS5vdXQpOwogICAgICAgICAgICBzb2x2ZSgpOwogICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7CiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CiAgICAgICAgfQogICAgfQoKICAgIGludCBuZXh0SW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChuZXh0VG9rZW4oKSk7CiAgICB9CgogICAgbG9uZyBuZXh0TG9uZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgcmV0dXJuIExvbmcucGFyc2VMb25nKG5leHRUb2tlbigpKTsKICAgIH0KCiAgICBkb3VibGUgbmV4dERvdWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgcmV0dXJuIERvdWJsZS5wYXJzZURvdWJsZShuZXh0VG9rZW4oKSk7CiAgICB9CgogICAgU3RyaW5nIG5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgd2hpbGUgKHRva2VuaXplciA9PSBudWxsIHx8ICF0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7CiAgICAgICAgICAgIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocmVhZGVyLnJlYWRMaW5lKCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdG9rZW5pemVyLm5leHRUb2tlbigpOwogICAgfQp9