Pagini recente » Cod sursa (job #248304) | Cod sursa (job #2466066) | Cod sursa (job #1908768) | Cod sursa (job #2727752) | Cod sursa (job #195041)
Cod sursa(job #195041)
#include <stdio.h>
#include <string.h>
const int N_MAX = 110;
char a[N_MAX][N_MAX][N_MAX], b[N_MAX][N_MAX][N_MAX];
char sol[N_MAX], catea[N_MAX], cateb[N_MAX], ca[N_MAX];
void add(char A[], char B[])
{
int i, t = 0;
for (i = 1; i <= A[0] || i <= B[0] || t; i ++, t /= 10) {
A[i] = (t += A[i] + B[i]) % 10;
}
A[0] = i - 1;
}
void sub(char A[], char B[])
{
int i, t = 0;
for (i = 1; i <= A[0]; i ++) {
A[i] -= B[i] + t;
t = A[i] < 0;
A[i] += t * 10;
}
for (; A[0] > 1 && !A[A[0]]; A[0] --);
}
int comp(char A[], char B[])
{
if (A[0] != B[0]) return (A[0] < B[0]);
else {
for (int i = A[0]; i >= 1; i --) {
if (A[i] != B[i]) return (A[i] < B[i]);
}
}
return 1;
}
void afis(char v[])
{
for (int i = v[0]; i >= 1; i --) printf("%d", v[i]);
printf("\n");
}
int main()
{
freopen("pavare2.in", "r", stdin);
#ifndef _SCREEN_
freopen("pavare2.out", "w", stdout);
#endif
int N, A, B, K;
scanf("%d %d %d\n", &N, &A, &B);
scanf("%d\n", &K);
a[1][1][0] = a[1][1][1] = 1, b[1][1][0] = b[1][1][1] = 1;
for (int i = 2; i <= N; i ++) {
for (int j = 1; j <= i; j ++) {
a[i][j][0] = b[i][j][0] = 1;
if (j > A) a[i][j][0] = 1;
else {
if (j >= 2) memcpy(a[i][j], a[i - 1][j - 1], sizeof(a[i - 1][j - 1]));
else {
for (int k = 1; k <= B; k ++) add(a[i][j], b[i - 1][k]);
}
}
if (j > B) b[i][j][0] = 1;
else {
if (j >= 2) memcpy(b[i][j], b[i - 1][j - 1], sizeof(b[i - 1][j - 1]));
else {
for (int k = 1; k <= A; k ++) add(b[i][j], a[i - 1][k]);
}
}
}
}
sol[0] = 1;
for (int i = 1; i <= A; i ++) add(sol, a[N][i]);
for (int i = 1; i <= B; i ++) add(sol, b[N][i]);
for (int i = sol[0]; i >= 1; i --) printf("%d", sol[i]);
printf("\n");
if (K == 1) {
int j;
for (int i = 1; i <= N;) {
for (j = i; j <= i + A - 1 && j <= N; j ++) printf("0");
if (j <= N) printf("1");
i = i + A + 1;
}
printf("\n");
return 0;
}
int dim = 0;
while (K > 0) {
ca[++ dim] = K % 10;
K /= 10;
}
ca[0] = dim;
int lasta = 0, lastb = 0, last = -1;
for (int i = 1; i <= N; i ++) {
memset(catea, 0, sizeof(catea));
memset(cateb, 0, sizeof(cateb));
catea[0] = cateb[0] = 1;
for (int j = 1; j <= A - lasta; j ++) add(catea, a[N - i + 1][j]);
for (int j = 1; j <= B - lastb; j ++) add(cateb, b[N - i + 1][j]);
// afis(ca);
if (comp(ca, catea)) {
printf("0");
if (last == 0) lasta ++;
else {
last = 0;
lasta = 1;
lastb = 0;
}
}
else {
printf("1");
if (last == 1) lastb ++;
else {
last = 1;
lastb = 1;
lasta = 0;
}
// printf("scad:\n");
// afis(ca);
// afis(catea);
sub(ca, catea);
// printf("rezultat:\n");
// afis(ca);
}
}
printf("\n");
return 0;
}