Pagini recente » Cod sursa (job #428763) | Cod sursa (job #1116583) | Cod sursa (job #1425335) | Cod sursa (job #327272) | Cod sursa (job #179873)
Cod sursa(job #179873)
#include <fstream>
#define MAX 101
using namespace std;
int a[MAX][MAX][3][MAX], K[MAX];
int rez[MAX], v[3];
int n, A, B;
void sub(int X[], int Y[])
{
int i, t = 0;
for (i = 1; i <= X[0]; i++)
X[i] += (t = (X[i] -= Y[i] + t) < 0) * 10;
for (; X[0] > 1 && !X[X[0]]; X[0]--);
}
void add(int X[], int Y[])
{
int i, t = 0;
for (i = 1; i <= X[0] || i <= Y[0] || t; i++, t/=10)
X[i] = (t += X[i] + Y[i]) % 10;
X[0] = i - 1;
}
int cmp(int X[], int Y[])
{
int i;
if (X[0] > Y[0]) return 1;
if (Y[0] > X[0]) return -1;
for (i = X[0]; i >= 1; i--)
{
if (X[i] > Y[i]) return 1;
if (Y[i] > X[i]) return -1;
}
return 0;
}
ofstream fout("pavare2.out");
void Rec(int n, int x)
{
if (n <= 0) return;
int j, ok = 0;
for (j = 1; j <= A && j <= n && cmp(a[n][j][0], K) != -1; j++)
{
ok = 1;
fout << 0;
}
if (cmp(a[n][j][0], K) != 1)
{
sub(K, a[n][j][0]);
if (n-j > 0) fout << 1;
Rec(n-j, x);
}
else
{
if (n-1 > 0)fout << 1;
Rec(n-1, x);
}
}
int main()
{
int i, j, k;
string s;
ifstream fin("pavare2.in");
fin >> n >> A >> B;
fin >> s;
v[0] = A, v[1] = B;
K[0] = s.length();
for (i = K[0]-1, j = 1; i >= 0; i--, j++)
K[j] = s[i]-'0';
fin.close();
for (i = 1; i <= n; i++)
{
a[i][i][0][0] = a[i][i][0][1] = 1;
a[i][i][1][0] = a[i][i][1][1] = 1;
for (j = 1; j <= A && j < i; j++)
{
a[i][j][0][0] = 1;
for (k = 1; k <= B && k <= i-j; k++)
add(a[i][j][0], a[i-j][k][1]);
}
for (j = 1; j <= B && j <= i; j++)
{
a[i][j][1][0] = 1;
for (k = 1; k <= A && k <= i-j; k++)
add(a[i][j][1], a[i-j][k][0]);
}
}
rez[0] = 1;
for (i = 1; i <= A; i++)
add(rez, a[n][i][0]);
for (i = 1; i <= B; i++)
add(rez, a[n][i][1]);
for (i = rez[0]; i >= 1; i--)
fout << rez[i];
fout << "\n";
Rec(n, 0);
fout.close();
return 0;
}