Pagini recente » Cod sursa (job #3126881) | Cod sursa (job #1316126) | Cod sursa (job #126200) | Cod sursa (job #1616413) | Cod sursa (job #1473267)
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxN 102
#define ct 9
#define maxL 102
using namespace std;
int n, a, b, i, j, dp[maxN][maxN][2][maxL], s[maxN][2][maxL];
int v[maxL], k[maxL], sol[maxN];
char S[maxL];
int comp(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 >= 1; -- i)
if (A[i] < B[i])
return -1;
else
if (A[i] > B[i])
return 1;
return 0;
}
void add(int A[], int 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(int A[], int B[])
{
int i, t = 0;
for (i = 1; i <= A[0]; i++) {
A[i] -= ((i <= B[0]) ? B[i] : 0) + t;
A[i] += (t = A[i] < 0) * 10;
}
for (; A[0] > 1 && !A[A[0]]; A[0]--);
}
void read()
{
freopen("pavare2.in", "r", stdin);
scanf("%d %d %d\n", &n, &a, &b);
gets(S);
}
void solve()
{
dp[0][0][0][0] = 1;
dp[0][0][0][1] = 1;
dp[0][0][1][0] = 1;
dp[0][0][1][1] = 1;
s[0][0][0] = 1;
s[0][0][1] = 1;
s[0][1][0] = 1;
s[0][1][1] = 1;
for (i = 1; i <= n; ++ i)
{
for (j = 1; j <= min(i, a); ++ j)
{
if (j > 1)
add(dp[i][j][0], dp[i - 1][j - 1][0]);
else
add(dp[i][j][0], s[i - 1][1]);
add(s[i][0], dp[i][j][0]);
}
for (j = 1; j <= min(i, b); ++ j)
{
if (j > 1)
add(dp[i][j][1], dp[i - 1][j - 1][1]);
else
add(dp[i][j][1], s[i - 1][0]);
add(s[i][1], dp[i][j][1]);
}
}
k[0] = strlen(S);
for (i = 0; i < k[0]; ++ i)
k[k[0] - i] = S[i] - '0';
}
void write()
{
int Pow, x, y;
freopen("pavare2.out", "w", stdout);
add(v, s[n][1]);
add(v, s[n][0]);
for (i = v[0]; i >= 1; -- i)
printf("%d", v[i]);
printf("\n");
for (i = 1; i <= n; ++ i)
{
j = 1;
while (comp(dp[n - i + 1][j][0], k) == -1 && j <= a)
{
sub(k, dp[n - i + 1][j][0]);
++ j;
}
if (j <= a && j < n - i + 1)
{
//sub(k, dp[n - i + 1][j - 1][0]);
for (y = 0; y < j; ++ y)
sol[i - y] = 0;
}
else
{
j = 1;
while (comp(dp[n - i + 1][j][1], k) == -1 && j <= b)
{
sub(k, dp[n - i + 1][j][1]);
++ j;
}
//sub(k, dp[n - i + 1][j - 1][1]);
for (y = 0; y < j; ++ y)
sol[i - y] = 1;
}
}
for (i = 1; i <= n; ++ i)
printf("%d", sol[i]);
}
int main()
{
read();
solve();
write();
return 0;
}