#include <iostream>
#include <string.h>
using namespace std;
typedef unsigned long long R;
typedef unsigned long long T;
#define __ctz __builtin_ctzll
const int SIZE = 36;
const int PART_SIZE = 18;
const int MAX_STEP = 1000;
int step = 0;
int score[SIZE];
T e = 1u;
R DP[SIZE][PART_SIZE+1][MAX_STEP];
void printMask(T mask){
cout <<"@ ";
for ( ; mask ; mask &= (mask - 1) )
cout << __ctz(mask) + 1<<" ";
cout << "\n";
}
void getSolution(int size, int part_size, R r_score, T mask ){
if (!DP[size][part_size][r_score])
return;
if (size == 0){
if (part_size > 0)
mask |= 1;
printMask(mask);
return;
}
if(part_size > 0)
getSolution(size-1, part_size-1, r_score - score[size], mask | (e << size) );
getSolution(size-1, part_size, r_score, mask );
}
void generateCalc(){
memset(DP, 0, sizeof(DP));
DP[0][0][0] = 1;
DP[0][1][score[0]] = 1;
for (int i=1; i < SIZE; i++)
for (int z=0; z <= PART_SIZE; z++)
for (int j = MAX_STEP - score[i] - 1; j >=0; j--){
if (z < PART_SIZE)
DP[i][z+1][j + score[i] ] += DP[i-1][z][j];
DP[i][z][j] += DP[i-1][z][j];
}
for (int i=0; i < MAX_STEP; i++){
if (DP[SIZE-1][PART_SIZE][i])
cout << "score " << 2*i - step <<" count " << DP[SIZE-1][PART_SIZE][i] << "\n";
if (DP[SIZE-1][PART_SIZE][i] < 30)
getSolution(SIZE-1,PART_SIZE,i,0);
}
cout << endl;
}
int main() {
// your code goes here
int tmp;
while (cin >> tmp){
if (!tmp)
continue;
score[tmp-1]++;
step++;
cout << "#step " << step<<" "<<tmp<<endl;
generateCalc();
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgoKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgUjsKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgVDsKCiNkZWZpbmUgX19jdHogX19idWlsdGluX2N0emxsIAoKY29uc3QgaW50IFNJWkUgPSAzNjsKY29uc3QgaW50IFBBUlRfU0laRSA9IDE4Owpjb25zdCBpbnQgTUFYX1NURVAgPSAxMDAwOwppbnQgc3RlcCA9IDA7CmludCBzY29yZVtTSVpFXTsKCgpUIGUgPSAxdTsKClIgRFBbU0laRV1bUEFSVF9TSVpFKzFdW01BWF9TVEVQXTsKCnZvaWQgcHJpbnRNYXNrKFQgbWFzayl7Cgljb3V0IDw8IkAgIjsKCWZvciAoIDsgbWFzayA7IG1hc2sgJj0gKG1hc2sgLSAxKSApCgkJY291dCA8PCAgX19jdHoobWFzaykgKyAxPDwiICI7Cgljb3V0IDw8ICJcbiI7Cn0Kdm9pZCBnZXRTb2x1dGlvbihpbnQgc2l6ZSwgaW50IHBhcnRfc2l6ZSwgUiByX3Njb3JlLCBUIG1hc2sgKXsKCWlmICghRFBbc2l6ZV1bcGFydF9zaXplXVtyX3Njb3JlXSkKCQlyZXR1cm47CglpZiAoc2l6ZSA9PSAwKXsKCQlpZiAocGFydF9zaXplID4gMCkKCQkJbWFzayB8PSAxOwoJCXByaW50TWFzayhtYXNrKTsKCQlyZXR1cm47Cgl9CglpZihwYXJ0X3NpemUgPiAwKQoJCWdldFNvbHV0aW9uKHNpemUtMSwgcGFydF9zaXplLTEsIHJfc2NvcmUgLSBzY29yZVtzaXplXSwgbWFzayB8IChlIDw8IHNpemUpICk7CglnZXRTb2x1dGlvbihzaXplLTEsIHBhcnRfc2l6ZSwgcl9zY29yZSwgbWFzayApOwoJCn0KCnZvaWQgZ2VuZXJhdGVDYWxjKCl7CgltZW1zZXQoRFAsIDAsIHNpemVvZihEUCkpOwoJRFBbMF1bMF1bMF0gPSAxOwoJRFBbMF1bMV1bc2NvcmVbMF1dID0gMTsKCWZvciAoaW50IGk9MTsgaSA8IFNJWkU7IGkrKykKCQlmb3IgKGludCB6PTA7IHogPD0gUEFSVF9TSVpFOyB6KyspCgkJCWZvciAoaW50IGogPSBNQVhfU1RFUCAtIHNjb3JlW2ldIC0gMTsgaiA+PTA7IGotLSl7CgkJCQlpZiAoeiA8IFBBUlRfU0laRSkKCQkJCQlEUFtpXVt6KzFdW2ogKyBzY29yZVtpXSBdICs9IERQW2ktMV1bel1bal07CgkJCQlEUFtpXVt6XVtqXSArPSBEUFtpLTFdW3pdW2pdOwoJCQl9Cglmb3IgKGludCBpPTA7IGkgPCBNQVhfU1RFUDsgaSsrKXsKCQlpZiAoRFBbU0laRS0xXVtQQVJUX1NJWkVdW2ldKQoJCQljb3V0IDw8ICJzY29yZSAiIDw8IDIqaSAtIHN0ZXAgPDwiIGNvdW50ICIgPDwgRFBbU0laRS0xXVtQQVJUX1NJWkVdW2ldIDw8ICJcbiI7CgkJaWYgKERQW1NJWkUtMV1bUEFSVF9TSVpFXVtpXSA8IDMwKQoJCQlnZXRTb2x1dGlvbihTSVpFLTEsUEFSVF9TSVpFLGksMCk7Cgl9Cgljb3V0IDw8IGVuZGw7CgkKfQoKCmludCBtYWluKCkgewoJLy8geW91ciBjb2RlIGdvZXMgaGVyZQoJaW50IHRtcDsKCXdoaWxlIChjaW4gPj4gdG1wKXsKCQlpZiAoIXRtcCkKCQkJY29udGludWU7CgkJc2NvcmVbdG1wLTFdKys7CgkJc3RlcCsrOwoJCWNvdXQgPDwgIiNzdGVwICIgPDwgc3RlcDw8IiAiPDx0bXA8PGVuZGw7CgkJZ2VuZXJhdGVDYWxjKCk7Cgl9CglyZXR1cm4gMDsKfQ==