Cod sursa(job #109885)

Utilizator Adela_BaciuAdela Baciu Adela_Baciu Data 25 noiembrie 2007 12:53:08
Problema Ecuatie Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasele 5-8 Marime 3.08 kb
#include<stdio.h>
#include<math.h>
long ok1,l,j,p1,p2,q1,q2,ok,aux,i,a,b,c,k,lima,limc,d,diva[1000],divc[1000],solp1[1000],solp2[1000],solq1[1000],solq2[1000];
int main()
{
 freopen("ecuatie.in","r",stdin);
 freopen("ecuatie.out","w",stdout);

 scanf("%ld %ld %ld %ld",&a,&b,&c,&k);
 if(a<0)
  {a=0-a; lima=sqrt(a);}
 else
  lima=sqrt(a);

 if(c<0)
  { c=0-c; limc=sqrt(c);}
 else
  limc=sqrt(c);
 for(i=1;i<limc;i++)
  if(c%i==0)
   {
    divc[++divc[0]]=i; divc[++divc[0]]=0-i;
    divc[++divc[0]]=c/i; divc[++divc[0]]=0-(c/i);
   }
 if(c%limc==0&&limc*limc==c)
  {divc[++divc[0]]=limc; divc[++divc[0]]=0-limc;}
 else
  if(c%limc==0)
   {
    divc[++divc[0]]=limc; divc[++divc[0]]=0-limc;
    divc[++divc[0]]=c/limc; divc[++divc[0]]=0-(c/limc);
   }

 for(i=1;i<lima;i++)
  if(a%i==0)
   {
    diva[++diva[0]]=i; diva[++diva[0]]=0-i;
    diva[++diva[0]]=a/i; diva[++diva[0]]=0-(a/i);
   }
 if(a%lima==0&&lima*lima==a)
  {diva[++diva[0]]=lima; diva[++diva[0]]=0-lima;}
 else
  if(a%lima==0)
   {
    diva[++diva[0]]=lima; diva[++diva[0]]=0-lima;
    diva[++diva[0]]=a/lima; diva[++diva[0]]=0-(a/lima);
   }

 /*divc[++divc[0]]=c; divc[++divc[0]]=0-c;
 diva[++diva[0]]=a; diva[++diva[0]]=0-a;
   */
 for(i=1;i<=divc[0];i++)
  for(j=1;j<=diva[0];j++)
   {
    p1=diva[j];
    p2=a/p1;
    q1=divc[i];
    q2=c/q1;

    if(p1*q2+q1*p2==b)
     {
      solp1[++solp1[0]]=p1;
      solp2[++solp2[0]]=p2;
      solq1[++solq1[0]]=q1;
      solq2[++solq2[0]]=q2;
     }
   }

  if(solp1[0]*2<k)
   printf("-1");
  else
   {
    ok=0;
    do
    {
     ok=1;
     for(i=1;i<solp1[0];i++)
      {

       if(solp1[i]>solp1[i+1])
	{
	 aux=solp1[i];
	 solp1[i]=solp1[i+1];
	 solp1[i+1]=aux;

	 aux=solp2[i];
	 solp2[i]=solp2[i+1];
	 solp2[i+1]=aux;

	 aux=solq1[i];
	 solq1[i]=solq1[i+1];
	 solq1[i+1]=aux;

	 aux=solq2[i];
	 solq2[i]=solq2[i+1];
	 solq2[i+1]=aux;
	 ok=0;
	}
       else
	{
	 if(solp1[i]==solp1[i+1]&&solq1[i]>solq1[i+1])
	  {
	   aux=solp1[i];
	   solp1[i]=solp1[i+1];
	   solp1[i+1]=aux;


	   aux=solp2[i];
	   solp2[i]=solp2[i+1];
	   solp2[i+1]=aux;

	   aux=solq1[i];
	   solq1[i]=solq1[i+1];
	   solq1[i+1]=aux;

	   aux=solq2[i];
	   solq2[i]=solq2[i+1];
	   solq2[i+1]=aux;
	   ok=0;
	  }
	}
       }
    }while(ok==0);

   printf("(");
   /*if(solp1[k]==1 && solp2[k]==1) printf("x");
   else
    if(solp1[k]==1) printf("%ldx",solp2[k]);
    else
     if(solp2[k]==1) printf("%ldx",solp1[k]);
     else
    if(solp1[k]==-1 && solp2[k]==-1) printf("x");
    else
     if(solp1[k]==-1 || solp2[k]==-1) printf("-x");*/

    if(solp1[k]==1) printf("x");
    else
     if(solp1[k]==-1) printf("-x");
     else printf("%ldx",solp1[k]);

     if(solq1[k]<0) printf("-%ld",solq1[k]);
     else printf("+%ld",solq1[k]);

     printf(") (");

     if(solp2[k]==1) printf("x");
    else
     if(solp2[k]==-1) printf("-x");
     else printf("%ldx",solp2[k]);

     if(solq2[k]<0) printf("-%ld",solq2[k]);
     else printf("+%ld",solq2[k]);

     printf(")");

   }
  fcloseall();
 return 0;
}