Pagini recente » Cod sursa (job #1058053) | Cod sursa (job #2756902) | Cod sursa (job #611698) | Cod sursa (job #141532) | Cod sursa (job #113265)
Cod sursa(job #113265)
#include <cstdio>
#include <cstring>
#include <cmath>
#include <fstream>
using namespace std;
#define FIN "ecuatie.in"
#define FOUT "ecuatie.out"
int A, B, C, K;
typedef struct
{
double p1, p2;
double q1, q2;
} solution;
solution S[10000];
int Nsol;
double x1, x2, delta;
void swap (int i, int j)
{
solution x;
x = S[i]; S[i] = S[j]; S[j] = x;
}
int part (int st, int dr)
{
int i, j, s = 1;
i = st; j = dr;
while (i < j)
{
if (S[i].p1 > S[j].p1)
{
swap (i, j);
s = 1 - s;
}
if (S[i].p1 == S[j].p1 && S[i].q1 > S[j].q1)
{
swap (i, j);
s = 1 - s;
}
if (s) ++i; else --j;
}
return i;
}
void sort (int st, int dr)
{
if (st < dr)
{
int p = part (st, dr);
sort (st, p - 1);
sort (p + 1, dr);
}
}
int EQ (int i, int j)
{
if (S[i].p1 != S[j].p1) return 0;
if (S[i].q1 != S[j].q1) return 0;
if (S[i].p2 != S[j].p2) return 0;
if (S[i].q2 != S[j].q2) return 0;
return 1;
}
int ok (int c)
{
if (S[c].p1 - (int)S[c].p1 != 0) return 0;
if (S[c].q1 - (int)S[c].q1 != 0) return 0;
if (S[c].p2 - (int)S[c].p2 != 0) return 0;
if (S[c].q2 - (int)S[c].q2 != 0) return 0;
return 1;
}
void actualizare (int i)
{
++Nsol;
S[Nsol].p1 = i; S[Nsol].q1 = (double) -x1*i; S[Nsol].p2 = (double)A/i; S[Nsol].q2 = (double)-x2*(A/i);
if (!ok(Nsol)) Nsol --;
++Nsol;
S[Nsol].p1 = i; S[Nsol].q1 = (double) -x2*i; S[Nsol].p2 = (double)A/i; S[Nsol].q2 = (double)-x1*(A/i);
if (!ok(Nsol)) Nsol --;
i = -i;
++Nsol;
S[Nsol].p1 = i; S[Nsol].q1 = (double) -x1*i; S[Nsol].p2 = (double)A/i; S[Nsol].q2 = (double)-x2*(A/i);
if (!ok(Nsol)) Nsol --;
++Nsol;
S[Nsol].p1 = i; S[Nsol].q1 = (double)-x2*i; S[Nsol].p2 = (double)A/i; S[Nsol].q2 = (double)-x1*(A/i);
if (!ok(Nsol)) Nsol --;
}
void solve ( void )
{
int i;
delta = (double)sqrt(B*B - 4*A*C);
x1 = (double)((-B - delta)/(2*A));
x2 = (double)((-B + delta)/(2*A));
int m;
if (A < 0) m = -A; else m = A;
for (i = 1; i <= (int)sqrt(m); ++i)
if (A % i == 0) actualizare(i);
i = A;
if (A % i == 0) actualizare (i);
i = A/2;
if (A % i == 0) actualizare (i);
sort (1, Nsol);
int p = 0;
for (i = 1; i <= Nsol; ++i)
{
if (!EQ(i, i - 1)) p++;
if (p == K) break;
}
if (!Nsol) i = 0;
if (S[i].p1 != 1 && S[i].p1 != -1) printf ("(%.0lf", S[i].p1);
else if (S[i].p1 == -1) printf ("(-");
else printf ("(");
if (S[i].q1 < 0) printf ("x-"); else printf ("x+");
printf ("%.0lf)", abs(S[i].q1));
if (S[i].p2 != 1 && S[i].p2 != -1) printf ("(%.0lf", S[i].p2);
else if (S[i].p2 == -1) printf ("(-");
else printf ("(");
if (S[i].q2 < 0) printf ("x-"); else printf ("x+");
printf ("%.0lf)", abs(S[i].q2));
printf ("\n");
}
int main ()
{
freopen (FIN, "r", stdin);
freopen (FOUT, "w", stdout);
scanf ("%d %d %d %d", &A, &B, &C, &K);
solve ();
return 0;
}