Problem:
Enumeration of Subsets III

You are given a set $T$, which is a subset of $S$. The set $S$ consists of $0, 1, ... n-1$.

Print all subsets of $T$.

Note that we represent $0, 1, ... n-1$ as 00...0001, 00...0010, 00...0100, ..., 10...0000 in binary respectively and the integer representation of a subset is calculated by bitwise OR of existing elements.

Input

The input is given in the following format.

$n$
$k \; b_0 \; b_1 \; ... \; b_{k-1}$

$k$ is the number of elements in $T$, and $b_i$ represents elements in $T$.

Output

Print the subsets ordered by their decimal integers. Print a subset in the following format.

$d$: $e_0$ $e_1$ ...

Print ':' after the integer value $d$, then print elements $e_i$ in the subset in ascending order. Separate two adjacency elements by a space character.

Constraints

$1 \leq n \leq 28$

$0 \leq k \leq 18$

$k \leq n$

$0 \leq b_i < n$

Sample Input 1

4
2 0 2

Sample Output 1

0:
1: 0
4: 2
5: 0 2

Solution in JAVA (judge verdict: Accepted)

import java.util.*;
import java.io.*;
public class Main {
	
	static List<binarySet> ls=new ArrayList<>();
	static char[] U;
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		
		int n=in.nextInt(),k=in.nextInt();
		
		U=new char[n];
		Arrays.fill(U, '0');
		
		List<Integer> T=new ArrayList<>();
		for(int i=0;i<k;i++)T.add(in.nextInt());
		
		solveSet(new ArrayList<Integer>(),T);
		ls.sort(Comparator.comparingInt(binarySet::getDecimal));
		
		PrintWriter out=new PrintWriter(System.out);
		out.println("0:");
		for(int i=0;i<ls.size();i++) {
			List<Integer> A=ls.get(i).ls;
			out.print(ls.get(i).dec+":");
			
			for(int j=0;j<A.size();j++)out.print(" "+A.get(j));
			out.println();
			out.flush();
		}
		
		out.flush();
	}
	
	static void solveSet(List<Integer> A,List<Integer> S) {
		
		for(int i=0;i<S.size();i++) {
			if(A.isEmpty() || S.get(i)>A.get(A.size()-1)) {
				List<Integer> t=new ArrayList<>(A);
				t.add(S.get(i));
				ls.add(new binarySet(t,U));
				solveSet(t,S);
			}
		}
	}

}
class binarySet{
	List<Integer> ls;
	int dec;
	binarySet(List<Integer> A,char[] c){
		ls=A;
		char[] t=c.clone();
		for(int i=0;i<ls.size();i++) {
			t[c.length-1-A.get(i)]='1';
		}
		dec=Integer.parseInt(String.valueOf(t),2);
	}
	
	int getDecimal() {
		return dec;
	}
}