#include "decoder.h"
#include "decoderlib.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXN 105
#define MAXK 55
struct node
{
int len;
int cnt[MAXK];
char b[MAXK];
};
static long long int C[MAXK][MAXK];
long long int ConvToNum (struct node comb)
{
long long int res = 0LL;
int N, K, i;
N = comb.len; K = 15;
for (i = 15; i < N; i++) res += C[i][K];
for (i = 0; i < comb.len; i++)
{
if (comb.b[i])
{
if (N != K) res += C[N-1][K];
N--; K--;
}
else
{
N--;
}
}
return res;
}
void decode(int N, int L, int X[])
{
C[0][0] = 1LL;
int i, j;
for (i = 1; i <= 50; i++)
{
C[i][0] = 1LL;
for (j = 1; j < i; j++) C[i][j] = C[i-1][j-1] + C[i-1][j];
C[i][i] = 1LL;
}
int ac = (N+3)/4;
struct node a[MAXN];
memset(a,0,sizeof(a));
for (i = 0; i < L; i++)
{
(a[X[i] / 16].cnt[X[i] % 16])++;
}
int now = 0;
int nownum[4];
for (i = 0; i < ac; i++)
{
for (j = 0; j < 16; j++)
{
int k;
for (k = 0; k < a[i].cnt[j]; k++)
{
a[i].b[a[i].len] = 0;
(a[i].len)++;
}
a[i].b[a[i].len] = 1;
(a[i].len)++;
}
(a[i].len)--;
long long int num = ConvToNum(a[i]);
for (j = 0; j < 4; j++)
{
nownum[j] = num % 256LL;
num /= 256LL;
}
for (j = 0; j < 4; j++)
{
if (now < N) output(nownum[j]);
now++;
}
}
}