[ create a new paste ] login | about

Link: http://codepad.org/09R1OUHl    [ raw code | fork ]

C, pasted on Dec 26:
#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++;
		}		
	}
}


Create a new paste based on this one


Comments: