Cod sursa(job #790081)

Utilizator GrimpowRadu Andrei Grimpow Data 20 septembrie 2012 12:43:44
Problema Pavare2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include<stdio.h>
#include<string.h>

#define lg 105

int n, a, b, K[lg], d[lg][lg][2][lg], i, j, sol[lg], trc[lg], s, rsp[lg], p;
char sir[lg];

void add(int a[], int b[]){
	int i, p = 0;

	for (i = 1; i <= a[0] || i <= b[0] || p; i ++, p /= 10)
		a[i] = (p += a[i] + b[i]) % 10;
	a[0] = i-1;
}
void sub(int a[], int b[]){
	int i, p = 0;

	for (i = 1; i <= a[0]; i ++)
		a[i] += (p = (a[i] -= b[i] + p) < 0) * 10;
	for (; !a[a[0]]; a[0] --);
}
int cmp(int a[], int b[]){
	int i;
	if (a[0] < b[0])
		return -1;
	if (a[0] > b[0])
		return 1;

	for (i = a[0]; i; i --){
		if (a[i] < b[i])
			return -1;
		if (a[i] > b[i])
			return 1;
	}
	return -1;
}
void afis(int a[]){
	for (int i = 1; i <= a[0]; i ++)
		printf("%d", a[i]);
	printf("\n");
}

int main()
{
	freopen("pavare2.in", "rt", stdin);
	freopen("pavare2.out", "wt", stdout);

	scanf("%d%d%d\n%s", &n, &a, &b, sir);

	int xx = strlen(sir);
	for (i = xx-1; i >= 0; i --)
		K[++ K[0]] = sir[i] - '0';

	d[1][1][0][0] = d[1][1][0][1] = 1;
	d[1][1][1][0] = d[1][1][1][1] = 1;
	for (i = 1; i < n; i ++)
		for (j = 1; j <= a || j <= b; j ++){
			if (j <= a){
				if (j < a)
					add(d[i+1][j+1][0], d[i][j][0]);
				add(d[i+1][1][1], d[i][j][0]);
			}
			if (j <= b){
				if (j < b)
					add(d[i+1][j+1][1], d[i][j][1]);
				add(d[i+1][1][0], d[i][j][1]);
			}
		}
	for (i = 1; i <= a || i <= b; i ++){
		if (i <= a)
			add(sol, d[n][i][0]);
		if (i <= b)
			add(sol, d[n][i][1]);
	}
	for (i = sol[0]; i; i --)
		printf("%d", sol[i]);
	printf("\n");
	
	//naspa de acum
	//afis(d[n][a][0]);

	p = n+1; int pct = -1;
	while (p > 1){
		memset(sol, 0, sizeof(sol)); memset(trc, 0, sizeof(trc)); s = 0;

		if (pct == 0 || pct == -1)
			for (i = a; i; i --){
				add(sol, d[p-1][i][0]);
				if (cmp(K, sol) == -1){
					s = 1;
					p -= i;
					sub(K, trc); pct = 1;
					break;
				}
				else
					add(trc, d[p-1][i][0]);
			}
		if (s)
			continue;
		
		if (pct == 1 || pct == -1)
			for (i = 1; i <= b; i ++){
				add(sol, d[p-1][i][1]);
				if (cmp(K, sol) == -1){
					s = 1;
					for (j = p-1; j >= p-i; j --)
					rsp[j] = 1;
					p -= i;
					sub(K, trc); pct = 0;
					break;
				}
				else
					add(trc, d[p-1][i][1]);
			}	
		//afis(K);
	}

	for (i = n; i; i --)
		printf("%d", rsp[i]);
	printf("\n");

	return 0;
}