#include<cstdio>
#include<cstring>
using namespace std;
const char iname[] = "pavare2.in";
const char oname[] = "pavare2.out";
const int maxn = 105;
const int maxl = 25;
const int mod10 = 100000000;
const int base10 = 8;
int a, b, n;
void add(int A[], int B[])
{
int i, t = 0;
for (i=1; i<=A[0] || i<=B[0] || t; i++, t/=mod10)
A[i] = (t += A[i] + B[i]) % mod10;
A[0] = i - 1;
}
void sub(int A[], int B[])
{
int i, t = 0;
for (i = 1; i <= A[0]; i++)
A[i] += (t = (A[i] -= ((i <= B[0]) ? B[i] : 0) + t) < 0) * mod10;
for (; A[0] > 1 && !A[A[0]]; A[0]--);
}
bool cmp(int A[], int B[]) {
if (A[0] != B[0])
return A[0] < B[0];
for (int i = A[0]; i > 0; --i)
if (A[i] != B[i])
return A[i] < B[i];
return false;
}
char s[maxn];
int W[maxn][maxl], B[maxn][maxl], k[maxl], start;
int i, j;
inline int max(const int &a, const int &b) {
if (a < b)
return b;
return a;
}
int main() {
freopen(iname, "r", stdin);
freopen(oname, "w", stdout);
scanf("%d%d%d\n", &n, &a, &b);
fgets(s, sizeof(s), stdin);
for (i = 0; s[i] != 0 && s[i] != '\n'; ++i);
for (--i; i >= 0; i -= base10) {
k[++k[0]] = 0;
for (j = max(i - base10 + 1, 0); j <= i; ++j)
k[k[0]] = k[k[0]] * 10 + s[j] - '0';
}
W[0][0] = W[0][1] = 1;
B[0][0] = B[0][1] = 1;
for (i = 1; i <= n; ++i) {
memset(W[i], 0, sizeof(W[i]));
memset(B[i], 0, sizeof(B[i]));
for (j = max(i - b, 0); j < i; ++j)
add(B[i], W[j]);
for (j = max(i - a, 0); j < i; ++j)
add(W[i], B[j]);
}
memset(W[n + 1], 0, sizeof(W[n + 1]));
add(W[n + 1], W[n]);
add(W[n + 1], B[n]);
printf("%d", W[n + 1][W[n + 1][0]]);
for (i = W[n + 1][0] - 1; i > 0; --i)
printf("%08d", W[n + 1][i]);
printf("\n");
if (cmp(W[n], k))
sub(k, W[n]), start = 1;
else
start = 0;
i = n;
while (i > 0) {
if (start == 0) {
for (j = max(i - a, 0); j < i && cmp(B[j], k); ++j)
sub(k, B[j]);
while (i > j)
printf("0"), --i;
start = 1;
continue;
}
for (j = i - 1; j >= 0 && j > i - b && cmp(W[j], k); --j)
sub(k, W[j]);
while (i > j)
printf("1"), --i;
start = 0;
}
printf("\n");
}