Cod sursa(job #130372)

Utilizator oldcatanca popescu oldcat Data 31 ianuarie 2008 22:22:24
Problema Ecuatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 kb
#include<iostream.h>
#include<stdio.h>
#include<math.h>
int main()
{ double de, x, x1, x2, r;
  long a, b, c, d,n, nr, i, k, aux, sch, l, v[500001];
    freopen("ecuatie.in", "rt", stdin);
  freopen("ecuatie.out", "wt", stdout);
  cin>>a>>b>>c>>k;
  de=b*b-4*a*c;
  if(de<0) cout<<-1;
  else if((long)sqrt(de)!=sqrt(de)) cout<<-1;
  else { r=sqrt(abs(a));
	 for(i=0, d=1;d<r;d++)
	 if(a%d==0) { v[i++]=-d; v[i++]=d;
		      v[i++]=-a/d; v[i++]=a/d;
		    }
	 if(d==r) {v[i++]=d; v[i++]=-d;
		  }
	 l=i-1;n=i;
  do{sch=0;
     for(i=0;i<l;i++)
       if(v[i]>v[i+1]) {aux=v[i]; v[i]=v[i+1];
			v[i+1]=aux;sch=1;
		       }
     l--;
    }while(sch);
    if(de==0) { x=-b/(2.*a);
    for(i=0, nr=0;i<n;i++)
    if((long)(v[i]*x)==v[i]*x && (long)(a/v[i]*x)==a/v[i]*x)
	 {nr++; if(nr==k) break;}
    if(i<n){ cout<<'(';
	       if (abs(v[i])!=1) cout<<v[i];
	       else if (v[i]==-1) cout<<'-';
	       cout<<'x'<<((-1*v[i]*x>0)?'+':'-')<<abs(v[i]*x)<<")(";
	       if (abs(a/v[i])!=1) cout<<a/v[i];
	       else if (a/v[i]==-1) cout<<'-';
	       cout<<'x'<<((-1*a/v[i]*x>0)?'+':'-')<<abs(a/v[i]*x)<<")";
	    }
    else cout<<-1;
		}
     else { x1=(-b+sqrt(de))/(2*a);
	    x2=(-b-sqrt(de))/(2*a);
	    for(i=0, nr=0;i<n;i++)
	      if(-1*v[i]*x1<-1*v[i]*x2)
	     {if((long)(v[i]*x1)==v[i]*x1 && (long)(a/v[i]*x2)==a/v[i]*x2)
			{nr++; if(nr==k) {aux=1;break;}}
	      if((long)(v[i]*x2)==v[i]*x2 && (long)(a/v[i]*x1)==a/v[i]*x1)
		{nr++; if(nr==k){aux=2; break;}}
	      } else{ if((long)(v[i]*x2)==v[i]*x2 && (long)(a/v[i]*x1)==a/v[i]*x1)
			{nr++; if(nr==k) {aux=2;break;}}
	      if((long)(v[i]*x1)==v[i]*x1 && (long)(a/v[i]*x2)==a/v[i]*x2)
		{nr++; if(nr==k) {aux=1;break;}}
		}
	      if(i<n) if(aux==1)
		     {cout<<'(' ;
		      if (abs(v[i])!=1) cout<<v[i] ;
		       else if (v[i]==-1) cout<<'-';
			  cout<<'x'<<((-1*v[i]*x1>0)?'+':'-')<<abs(v[i]*x1)<<
		       ")(";
		       if (abs(a/v[i])!=1) cout<<a/v[i];
			else if(a/v[i]==-1) cout<<'-';
			cout<<'x'<<((-1*a/v[i]*x2>0)?'+':'-')<<abs(a/v[i]*x2)<<")";
		      }
		       else
		       {cout<<'(';
			if (abs(v[i])!=1) cout<<v[i] ;
		       else if (v[i]==-1) cout<<'-';
			cout<<'x'<<((-1*v[i]*x2>0)?'+':'-')<<abs(v[i]*x2)<<
		       ")(";
		       if (abs(a/v[i])!=1) cout<<a/v[i];
			else if(a/v[i]==-1) cout<<'-';
		       cout<<'x'<<((-1*a/v[i]*x1>0)?'+':'-')<<abs(a/v[i]*x1)<<")";
		       }

		   else cout<<-1;
	     }         	     }
  return 0;
}