Pagini recente » Cod sursa (job #18976) | Cod sursa (job #1270719) | Cod sursa (job #2201356) | Profil mihaistamatescu | Cod sursa (job #5778)
Cod sursa(job #5778)
#include <stdio.h>
#include <string.h>
#define NMAX 111
#define CMAX 69
#define BAZA 10
#define min(a, b) ((a) < (b) ? (a):(b))
int V[2][NMAX][NMAX][CMAX], A, B, N, K[CMAX];
int s[CMAX];
int comp(int n, int m)
{
int l1 = CMAX-1, l2 = CMAX-1;
while (K[l1] == 0 && l1 > 0) l1--;
while (V[n][N][m][l2] == 0 && l2 > 0) l2--;
if (l1 > l2) return 1;
if (l1 == l2)
{
while (K[l1] == V[n][N][m][l1] && l1 > 0) l1--;
if (K[l1] > V[n][N][m][l1]) return 1;
}
return 0;
}
int main()
{
int i, j, k, a = 0, n = 0;
char str[4*CMAX];
freopen("pavare2.in", "r", stdin);
scanf("%d %d %d", &N, &A, &B);
scanf(" %s", str);
for (i = 0; i < strlen(str); i++) K[n++] = str[i]-48;
for (i = 0; i < n/2; i++)
k = K[i], K[i] = K[n-i-1], K[n-i-1] = k;
V[0][1][0][0] = V[0][1][1][0] = V[1][1][0][0] = V[1][1][1][0] = 1;
for (i = 2; i <= N; i++)
{
for (j = 1; j <= min(i, A); j++)
{
for (k = 0; k < CMAX; k++) V[0][i][j][k] = V[0][i-1][j-1][k];
for (k = 0; k < CMAX; k++)
if (V[0][i][j][k] >= BAZA)
V[0][i][j][k+1] += (V[0][i][j][k]/BAZA), V[0][i][j][k] %= BAZA;
}
for (j = 1; j <= min(i, B); j++)
{
for (k = 0; k < CMAX; k++) V[1][i][j][k] = V[1][i-1][j-1][k];
for (k = 0; k < CMAX; k++)
if (V[1][i][j][k] >= BAZA)
V[1][i][j][k+1] += (V[1][i][j][k]/BAZA), V[1][i][j][k] %= BAZA;
}
for (j = 1; j <= min(i, B); j++)
{
for (k = 0; k < CMAX; k++) V[0][i][0][k] += V[1][i][j][k];
for (k = 0; k < CMAX; k++)
if (V[0][i][0][k] >= BAZA)
V[0][i][0][k+1] += (V[1][i][0][k]/BAZA), V[1][i][0][k] %= BAZA;
}
for (j = 1; j <= min(i, A); j++)
{
for (k = 0; k < CMAX; k++) V[1][i][0][k] += V[0][i][j][k];
for (k = 0; k < CMAX; k++)
if (V[1][i][0][k] >= BAZA)
V[1][i][0][k+1] += (V[1][i][0][k]/BAZA), V[1][i][0][k] %= BAZA;
}
}
for (i = 1; i <= A; i++)
{
for (k = 0; k < CMAX; k++) s[k] += V[0][N][i][k];
for (k = 0; k < CMAX; k++)
if (s[k] >= BAZA)
s[k+1] += (s[k]/BAZA), s[k] %= BAZA;
}
for (i = 1; i <= B; i++)
{
for (k = 0; k < CMAX; k++) s[k] += V[1][N][i][k];
for (k = 0; k < CMAX; k++)
if (s[k] >= BAZA)
s[k+1] += (s[k]/BAZA), s[k] %= BAZA;
}
freopen("pavare2.out", "w", stdout);
j = CMAX-1;
while (s[j] == 0) j--;
for (; j >= 0; j--) printf("%d", s[j]);
printf("\n");
while (N)
{
for (j = A; j > 0; j--)
if (comp(0, j))
{
for (k = 0; k < CMAX; k++) K[k] -= V[0][N][j][k];
for (k = 0; k < CMAX; k++)
{
if (K[k] < 0)
K[k] += BAZA, K[k+1]--;
}
}
else
{
for (i = 0; i < j; i++) printf("0");
N -= j;
break;
}
for (j = 1; j <= B; j++)
if (comp(1, j))
{
for (k = 0; k < CMAX; k++) K[k] -= V[1][N][j][k];
for (k = 0; k < CMAX; k++)
if (K[k] < 0)
K[k] += BAZA, K[k+1]--;
}
else
{
for (i = 0; i < j; i++) printf("1");
N -= j;
break;
}
}
printf("\n");
return 0;
}