Pagini recente » Cod sursa (job #1594072) | Cod sursa (job #233874) | Cod sursa (job #1906295) | Cod sursa (job #1846385) | Cod sursa (job #1044625)
#include <fstream>
#include <cstring>
using namespace std;
int n, A, B, K[35];
int alb[110][110][35], negru[110][110][35], sol[35];
inline void Adunare(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;
}
inline void Scadere(int A[], int B[])
{
int i, t = 0;
for(i = 1; i <= A[0]; ++i)
{
if(i <= B[0])
A[i] = A[i] - B[i] - t;
else
A[i] = A[i] - t;
if(A[i] < 0)
{
t = 1;
A[i] += 10;
}
else
t = 0;
}
while(A[0] > 1 && A[A[0]] == 0)
A[0]--;
}
inline int Compara(int A[], int B[])
{
if(A[0] < B[0])
return -1;
if(A[0] > B[0])
return 1;
for(int i = A[0]; i > 0; --i)
{
if(A[i] < B[i])
return -1;
if(A[i] > B[i])
return 1;
}
return 0;
}
int main()
{
int i, j, lim, ns, last, nr;
char s[35];
ifstream fin("pavare2.in");
fin >> n >> A >> B;
fin >> (s + 1);
fin.close();
ns = strlen(s + 1);
for(i = 1; i <= ns; ++i)
K[i] = s[ns - i + 1] - '0';
K[0] = ns;
for(i = 1; i <= A; ++i)
alb[n + 1][i][0] = alb[n + 1][i][1] = 1;
for(i = 1; i <= B; ++i)
negru[n + 1][i][0] = negru[n + 1][i][1] = 1;
for(i = n; i > 0 ; --i)
{
lim = min(n, i + A - 1);
for(j = i; j <= lim; ++j)
Adunare(alb[i][j - i + 1], negru[j + 1][B]);
for(j = 2; j <= A; ++j)
Adunare(alb[i][j], alb[i][j - 1]);
lim = min(n, i + B - 1);
for(j = i; j <= lim; ++j)
Adunare(negru[i][j - i + 1], alb[j + 1][A]);
for(j = 2; j <= B; ++j)
Adunare(negru[i][j], negru[i][j - 1]);
}
Adunare(sol, alb[1][A]);
Adunare(sol, negru[1][B]);
ofstream fout("pavare2.out");
for(i = sol[0]; i > 0; --i)
fout << sol[i];
fout << "\n";
if(Compara(K, alb[1][A]) <= 0)
{
fout << "0";
last = 0;
nr = 1;
}
else
{
Scadere(K, alb[1][A]);
fout << "1";
last = 1;
nr = 1;
}
for(i = 2; i <= n; ++i)
{
if(last == 0 && nr == A)
{
fout << "1";
last = 1;
nr = 1;
continue;
}
if(last == 1 && nr == B)
{
fout << "0";
last = 0;
nr = 1;
continue;
}
if(last == 0)
{
if(Compara(K, alb[i][A - nr]) <= 0)
{
fout << "0";
nr++;
}
else
{
Scadere(K, alb[i][A - nr]);
fout << "1";
last = 1;
nr = 1;
}
}
else
{
if(Compara(K, alb[i][A]) <= 0)
{
fout << "0";
last = 0;
nr = 1;
}
else
{
Scadere(K, alb[i][A]);
fout << "1";
nr++;
}
}
}
fout << "\n";
fout.close();
return 0;
}