Consider the set of all non-negative integer powers of 3.
Consider the sequence of all subsets of S ordered by thevalue of the sum of their elements. The question is simple: find the setat the n-th position in the sequence and print it in increasingorder of its elements.
Each line of input contains a number n, which is a positiveinteger with no more than 19 digits. The last line of input contains0 and it should not be processed.
For each line of input, output a single line displaying then-th set as described above, in the format used in the sampleoutput.
Sample input
1 7 14 783 1125900981634049 0
Output for sample input
{ } { 3, 9 } { 1, 9, 27 } { 3, 9, 27, 6561, 19683 } { 59049, 3486784401, 205891132094649, 717897987691852588770249 }
import java.io.FileInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.io.PrintWriter;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.math.BigInteger;
public class Main implements Runnable{
private static final boolean DEBUG = false;
private BufferedReader cin;
private PrintWriter cout;
private StreamTokenizer tokenizer;
private BigInteger n;
private void init()
{
try {
if (DEBUG) {
cin = new BufferedReader(new InputStreamReader(
new FileInputStream("d:\\OJ\\uva_in.txt")));
} else {
cin = new BufferedReader(new InputStreamReader(System.in));
}
tokenizer = new StreamTokenizer(cin);
tokenizer.resetSyntax();
tokenizer.wordChars('a', 'z');
tokenizer.wordChars('A', 'Z');
tokenizer.wordChars('0', '9');
tokenizer.wordChars(128 + 32, 255);
tokenizer.whitespaceChars(0, ' ');
tokenizer.quoteChar('\'');
tokenizer.quoteChar('"');
cout = new PrintWriter(new OutputStreamWriter(System.out));
} catch (Exception e) {
e.printStackTrace();
}
}
private String next()
{
try {
tokenizer.nextToken();
if (tokenizer.ttype == StreamTokenizer.TT_EOF) return null;
else if (tokenizer.ttype == StreamTokenizer.TT_NUMBER) {
return String.valueOf((int)tokenizer.nval);
} else return tokenizer.sval;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private boolean input()
{
n = new BigInteger(next());
if (n.compareTo(BigInteger.ZERO) == 0) return false;
return true;
}
private void solve()
{
n = n.subtract(BigInteger.ONE);
ArrayList<BigInteger> ans = new ArrayList<BigInteger>();
int bitlen = n.bitLength();
for (int i = 0; i < bitlen; i++) {
if (n.testBit(i)) {
ans.add(BigInteger.valueOf(3).pow(i));
}
}
if (ans.isEmpty()) {
cout.println("{ }");
} else {
cout.print("{ ");
for (int i = 0, size = ans.size(); i < size; i++) {
if (i != 0) cout.print(", ");
cout.print(ans.get(i));
}
cout.println(" }");
}
cout.flush();
}
public void run()
{
init();
while (input()) {
solve();
}
}
public static void main(String[] args)
{
new Thread(new Main()).start();
}
}