Pagini recente » Cod sursa (job #1154990) | Cod sursa (job #2425056) | Cod sursa (job #1801175) | Cod sursa (job #2053330) | Cod sursa (job #1653376)
#include <fstream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
ifstream fin("pavare2.in");
ofstream fout("pavare2.out");
const int dim = 105;
int dp[dim][2][dim][35], k[35], cntMax[2], aux[35];
char s[35];
void add(int a[], int b[]) {
if (a[0] < b[0]) {
for (int i = a[0] + 1; i <= b[0]; ++i)
a[i] = 0;
a[0] = b[0];
}
else {
for (int i = b[0] + 1; i <= a[0]; ++i)
b[i] = 0;
}
int t = 0;
for (int i = 1; i <= a[0]; ++i) {
a[i] += b[i] + t;
t = a[i] / 10;
a[i] = a[i] % 10;
}
if (t)
a[++a[0]] = t;
}
void subtract(int a[], int b[]) {
for (int i = b[0] + 1; i <= a[0]; ++i)
b[i] = 0;
int t = 0;
for (int i = 1; i <= a[0]; ++i) {
a[i] -= b[i] + t;
if (a[i] < 0)
t = 1;
else
t = 0;
if (t == 1)
a[i] += 10;
}
while (a[0] && a[a[0]] == 0)
--a[0];
}
int comp(int a[], int b[]) {
if (a[0] > b[0])
return 1;
if (a[0] < b[0])
return -1;
for (int i = a[0]; i; --i) {
if (a[i] > b[i])
return 1;
if (a[i] < b[i])
return -1;
}
return 0;
}
int main() {
int n;
fin >> n >> cntMax[0] >> cntMax[1];
fin >> (s + 1);
k[0] = strlen(s + 1);
for (int i = k[0], j = 1; i; --i, ++j)
k[j] = s[i] - '0';
dp[1][0][1][0] = dp[1][0][1][1] = 1;
dp[1][1][1][0] = dp[1][1][1][1] = 1;
for (int i = 2; i <= n; ++i) {
for (int curr = 0; curr < 2; ++curr) {
aux[0] = 1, aux[1] = 0;
for (int j = 1; j <= cntMax[curr ^ 1]; ++j)
add(aux, dp[i - 1][curr ^ 1][j]);
add(dp[i][curr][1], aux);
for (int j = 2; j <= cntMax[curr]; ++j)
add(dp[i][curr][j], dp[i - 1][curr][j - 1]);
}
}
aux[0] = 1, aux[1] = 0;
for (int curr = 0; curr < 2; ++curr)
for (int i = 1; i <= cntMax[curr]; ++i)
add(aux, dp[n][curr][i]);
for (int i = aux[0]; i; --i)
fout << aux[i];
fout << '\n';
int curr = 0, cnt = 0;
for (int i = n; i;) {
int len = cntMax[0];
if (curr == 0)
len -= cnt;
len = min(len, i);
bool ok = false;
for (int j = len; j; --j) {
if (comp(k, dp[i][0][j]) == 1) {
subtract(k, dp[i][0][j]);
continue;
}
i -= j;
for (int step = 1; step <= j; ++step)
fout << 0;
if (curr == 0)
cnt += j;
else
cnt = j;
curr = 0;
ok = true;
break;
}
if (ok)
continue;
len = cntMax[1];
if (curr == 1)
len -= cnt;
len = min(len, i);
ok = false;
for (int j = 1; j <= len; ++j) {
if (comp(k, dp[i][1][j]) == 1) {
subtract(k, dp[i][0][j]);
continue;
}
i -= j;
for (int step = 1; step <= j; ++step)
fout << 1;
if (curr == 1)
cnt += j;
else
cnt = j;
curr = 1;
ok = true;
break;
}
}
fout << '\n';
return 0;
}
//Trust me, I'm the Doctor!