Pagini recente » Cod sursa (job #2436526) | Cod sursa (job #1801787) | Cod sursa (job #1535788) | Cod sursa (job #1191815) | Cod sursa (job #1044617)
#include <fstream>
#include <cstring>
using namespace std;
int n, A, B, K[35];
int alb[110][35], negru[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;
alb[n + 1][0] = alb[n + 1][1] = 1;
negru[n + 1][0] = negru[n + 1][1] = 1;
for(i = n; i > 0 ; --i)
{
lim = min(n, i + A - 1);
for(j = i; j <= lim; ++j)
Adunare(alb[i], negru[j + 1]);
lim = min(n, i + B - 1);
for(j = i; j <= lim; ++j)
Adunare(negru[i], alb[j + 1]);
}
Adunare(sol, alb[1]);
Adunare(sol, negru[1]);
ofstream fout("pavare2.out");
for(i = sol[0]; i > 0; --i)
fout << sol[i];
fout << "\n";
if(Compara(K, alb[1]) <= 0)
{
fout << "0";
last = 0;
nr = 1;
}
else
{
Scadere(K, alb[1]);
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(Compara(K, alb[i]) <= 0)
{
fout << "0";
if(last == 1)
nr = 1;
else
nr++;
last = 0;
}
else
{
Scadere(K, alb[i]);
fout << "1";
if(last == 0)
nr = 1;
else
nr++;
last = 1;
}
}
fout << "\n";
fout.close();
return 0;
}