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++)
cout << grundy[i] << endl;
}
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();
}
}
aW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwppbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKCnB1YmxpYyBjbGFzcyBHYW1lIGltcGxlbWVudHMgUnVubmFibGUgewogICAgcHJpdmF0ZSB2b2lkIHNvbHZlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBpbnQgbiA9IG5leHRJbnQoKTsKICAgICAgICBpbnRbXSBncnVuZHkgPSBuZXcgaW50W24gKyAxXTsKICAgICAgICBpbnRbXSBzZWVuID0gbmV3IGludFtuICsgMl07CiAgICAgICAgaW50W10gbWluTW92ZXMgPSBuZXcgaW50W24gKyAxXTsKICAgICAgICBBcnJheXMuZmlsbChtaW5Nb3ZlcywgSW50ZWdlci5NQVhfVkFMVUUpOwogICAgICAgIEFycmF5cy5maWxsKHNlZW4sIC0xKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBuOyArK2kpIHsKICAgICAgICAgICAgZm9yIChpbnQgY291bnQgPSAyOyBjb3VudCAqIChjb3VudCArIDEpIC8gMiA8PSBpOyArK2NvdW50KSB7CiAgICAgICAgICAgICAgICBpbnQgZmlyc3QgPSAoaSAtIChjb3VudCAqIChjb3VudCAtIDEpKSAvIDIpOwogICAgICAgICAgICAgICAgaWYgKGZpcnN0ICUgY291bnQgIT0gMCkgY29udGludWU7CiAgICAgICAgICAgICAgICBmaXJzdCAvPSBjb3VudDsKICAgICAgICAgICAgICAgIGludCB4b3IgPSAwOwogICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgKytqKSB4b3IgXj0gZ3J1bmR5W2ZpcnN0ICsgal07CiAgICAgICAgICAgICAgICBzZWVuW3hvcl0gPSBpOwogICAgICAgICAgICAgICAgaWYgKHhvciA9PSAwKSBtaW5Nb3Zlc1tpXSA9IE1hdGgubWluKG1pbk1vdmVzW2ldLCBjb3VudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW50IGo7CiAgICAgICAgICAgIGZvciAoaiA9IDA7IHNlZW5bal0gPT0gaTsgKytqKTsKICAgICAgICAgICAgZ3J1bmR5W2ldID0gajsKICAgICAgICB9CiAgICAgICAgaWYgKG1pbk1vdmVzW25dID09IEludGVnZXIuTUFYX1ZBTFVFKQogICAgICAgICAgICB3cml0ZXIucHJpbnRsbigtMSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtaW5Nb3Zlc1tuXSk7CiAgICAgICAgZm9yKGludCBpID0gMDsgaSA8PSBuOyBpKyspCiAgICAgICAgY291dCA8PCBncnVuZHlbaV0gPDwgZW5kbDsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgbmV3IEdhbWUoKS5ydW4oKTsKICAgIH0KCiAgICBCdWZmZXJlZFJlYWRlciByZWFkZXI7CiAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyOwogICAgUHJpbnRXcml0ZXIgd3JpdGVyOwoKICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKFN5c3RlbS5pbikpOwogICAgICAgICAgICB0b2tlbml6ZXIgPSBudWxsOwogICAgICAgICAgICB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLm91dCk7CiAgICAgICAgICAgIHNvbHZlKCk7CiAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOwogICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKICAgICAgICB9CiAgICB9CgogICAgaW50IG5leHRJbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KG5leHRUb2tlbigpKTsKICAgIH0KCiAgICBsb25nIG5leHRMb25nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICByZXR1cm4gTG9uZy5wYXJzZUxvbmcobmV4dFRva2VuKCkpOwogICAgfQoKICAgIGRvdWJsZSBuZXh0RG91YmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICByZXR1cm4gRG91YmxlLnBhcnNlRG91YmxlKG5leHRUb2tlbigpKTsKICAgIH0KCiAgICBTdHJpbmcgbmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICB3aGlsZSAodG9rZW5pemVyID09IG51bGwgfHwgIXRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKICAgICAgICAgICAgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihyZWFkZXIucmVhZExpbmUoKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0b2tlbml6ZXIubmV4dFRva2VuKCk7CiAgICB9Cn0=