import std.algorithm, std.array, std.bigint, std.conv, std.stdio, std.typecons, std.range; BigInt[] solve(BigInt N, BigInt i) { if (N == 0) return []; // special case if (i == 1) return [N]; BigInt Ni = i; BigInt b = 1; while (1) { auto b2 = binom(Ni+1, i); if (b2 > N) break; else ++Ni, b = b2; } return [Ni] ~ solve(N - b, i-1); } void main() { auto tmp = readln.split.to!(ulong[]); auto seq = solve(BigInt(tmp[0]), BigInt(tmp[1])); auto ans = seq.map!(i => i.to!string ~ " ").reduce!`a ~ b`[0 .. $-1]; writeln(ans); } BigInt binom(BigInt N, BigInt M) { // special case if (M == 0) return BigInt(1); BigInt result = 1; iota(N-M+1, N+1).each!(n => result *= n); iota(1, M+1).each!(n => result /= n); return result; }