Cod sursa(job #205906)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 3 septembrie 2008 15:07:35
Problema Pavare2 Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int n, a, b, v[1005], s[1005], ca[1005], cb[1005], K[10000], cnt[10000], sol[1005], unu[1005];

int compar()
{
	if (K[0] > cnt[0]) return -1;
	if (K[0] < cnt[0]) return 1;
	for (int i = K[0]; i >= 1; i--)
	{
		if (K[i] > cnt[i]) return -1;
		if (K[i] < cnt[i]) return 1;
	}
	return 0;
}

void add(int A[], int B[])
{
	int i, t;

	for (i = 1, t = 0; i <= A[0] || t; i++, t /= 10)
		A[i] = (t += A[i] + B[i]) % 10;
	A[0] = i - 1;
}


void back(int k)
{
	int i;
	ca[k] = cb[k] = 0;
	if (k > n)
	{
		add(cnt, unu);
		if (compar() == 0) for (i = 1; i <= n; i++) sol[i] = s[i];
	}
	else
		for (i = 0; i <= 1; i++)
		{
			if (i == 0 && ca[k - 1] < a)
			{
				s[k] = i;
				ca[k] = ca[k - 1] + 1;
				cb[k] = 0;
				back(k + 1);
			}
			else if (i == 1 && cb[k - 1] < b)
			{
				s[k] = i;
				ca[k] = 0;
				cb[k] = cb[k - 1] + 1;
				back(k + 1);
			}
		}
}

void afis()
{
	int i;
	for (i = cnt[0]; i >= 1; i--) printf("%d",cnt[i]);
	printf("\n");
}

int main()
{
	freopen("pavare2.in","r",stdin);
	freopen("pavare2.out","w",stdout);

	char s[1000];
	int i;
	scanf("%d %d %d",&n,&a,&b);

	scanf("%s",&s);
	K[0] = strlen(s);
	for (i = 1; i <= K[0]; i++)
	{
		K[i] = s[ K[0] - i ] - '0';
	}


	cnt[0] = 1;
	unu[0] = unu[1] = 1;
	back(1);
	afis();
	for (i = 1; i <= n; i++) printf("%d",sol[i]);
	printf("\n");
	return 0;
}