Cod sursa(job #127404)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 23 ianuarie 2008 21:00:39
Problema Ecuatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.15 kb
#include <fstream.h>
#include <math.h>

ifstream fin("ecuatie.in");
ofstream fout("ecuatie.out");

struct cacat
{
   int a,b,c,d;
};

typedef struct cacat cc;
cc sir[100000];
int aa,b,c,k,nr,x1,x2;

void citire()
{
   fin>>aa>>b>>c>>k;
   fin.close();
}

void divizori()
{
    for (int i=1;i<sqrt(fabs(aa));i++)
       if (aa%i==0)
       {
	  sir[nr++].a=i;
	  sir[nr-1].b=-x1*sir[nr-1].a;
	  sir[nr-1].c=aa/sir[nr-1].a;
	  sir[nr-1].d=-x2*(aa/sir[nr-1].a);

	  sir[nr++].a=i;
	  sir[nr-1].b=-x2*sir[nr-1].a;
	  sir[nr-1].c=aa/sir[nr-1].a;
	  sir[nr-1].d=-x1*(aa/sir[nr-1].a);



	  sir[nr++].a=-i;
	  sir[nr-1].b=-x1*sir[nr-1].a;
	  sir[nr-1].c=aa/sir[nr-1].a;
	  sir[nr-1].d=-x2*(aa/sir[nr-1].a);

	  sir[nr++].a=-i;
	  sir[nr-1].b=-x2*sir[nr-1].a;
	  sir[nr-1].c=aa/sir[nr-1].a;
	  sir[nr-1].d=-x1*(aa/sir[nr-1].a);



	  sir[nr++].a=aa/i;
	  sir[nr-1].b=-x1*sir[nr-1].a;
	  sir[nr-1].c=aa/sir[nr-1].a;
	  sir[nr-1].d=-x2*(aa/sir[nr-1].a);

	  sir[nr++].a=aa/i;
	  sir[nr-1].b=-x2*sir[nr-1].a;
	  sir[nr-1].c=aa/sir[nr-1].a;
	  sir[nr-1].d=-x1*(aa/sir[nr-1].a);


	  sir[nr++].a=-aa/i;
	  sir[nr-1].b=-x1*sir[nr-1].a;
	  sir[nr-1].c=aa/sir[nr-1].a;
	  sir[nr-1].d=-x2*(aa/sir[nr-1].a);

	  sir[nr++].a=-aa/i;
	  sir[nr-1].b=-x2*sir[nr-1].a;
	  sir[nr-1].c=aa/sir[nr-1].a;
	  sir[nr-1].d=-x1*(aa/sir[nr-1].a);
       }

if (sqrt(aa)==long (sqrt(aa)))
{
int i=sqrt(aa);
	  sir[nr++].a=i;
	  sir[nr-1].b=-x1*sir[nr-1].a;
	  sir[nr-1].c=aa/sir[nr-1].a;
	  sir[nr-1].d=-x2*(aa/sir[nr-1].a);

	  sir[nr++].a=i;
	  sir[nr-1].b=-x2*sir[nr-1].a;
	  sir[nr-1].c=aa/sir[nr-1].a;
	  sir[nr-1].d=-x1*(aa/sir[nr-1].a);



	  sir[nr++].a=-i;
	  sir[nr-1].b=-x1*sir[nr-1].a;
	  sir[nr-1].c=aa/sir[nr-1].a;
	  sir[nr-1].d=-x2*(aa/sir[nr-1].a);

	  sir[nr++].a=-i;
	  sir[nr-1].b=-x2*sir[nr-1].a;
	  sir[nr-1].c=aa/sir[nr-1].a;
	  sir[nr-1].d=-x1*(aa/sir[nr-1].a);
}
}
void ordonare ()
{
   int ok=1,p=nr;
   while (ok)
   {
      ok=0;
      p--;
	 for (int i=0;i<p;i++)
	    if (sir[i].a>sir[i+1].a)
	    {
	       cc aux=sir[i];
	       sir[i]=sir[i+1];
	       sir[i+1]=aux;
		 ok=1;
	    }
	    else
	      if (sir[i].a==sir[i+1].a)
		 if (sir[i].b>sir[i+1].b)
		 {
		     cc aux=sir[i];
		     sir[i]=sir[i+1];
		     sir[i+1]=aux;
		     ok=1;
		 }

   }
}

void afisare()
{
  k--;
  if (k>nr)
    fout<<"-1";
  else
   {
    fout<<"(";
    if (sir[k].a==1)
	fout<<"x";
    else
       if (sir[k].a==-1)
	  fout<<"-x";
       else
	   fout<<sir[k].a<<"x";

   if (sir[k].b<0)
     fout<<sir[k].b;
   else
      fout<<"+"<<sir[k].b;
   fout<<")(";



   if (sir[k].c==1)
      fout<<"x";
   else
     if (sir[k].c==-1)
	fout<<"-x";
     else
	fout<<sir[k].c<<"x";

     if (sir[k].d<0)
	fout<<sir[k].d;
     else
	fout<<"+"<<sir[k].d;
     fout<<")\n";
   }
}

int main()
{
   citire();
   if (sqrt ((b*b-4*aa*c))!=long (sqrt((b*b-4*aa*c))))
      fout<<"-1";

   else
   {
      x1= (-b+sqrt ((b*b-4*aa*c)))/(2*aa) ;
      x2= (-b-sqrt ((b*b-4*aa*c)))/(2*aa);
      divizori();
      ordonare();
      afisare();
   }
   fout.close();
   return 0;
}