Cod sursa(job #130384)

Utilizator oldcatanca popescu oldcat Data 31 ianuarie 2008 23:03:17
Problema Ecuatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.78 kb
#include<iostream.h>
#include<stdio.h>
#include<math.h>
int main()
{ double de, r;
  long a, b, c,x1,x2,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) {
    for(i=0, nr=0;i<n;i++)
    if(v[i]*(-b)%(2*a)==0 && a/v[i]*(-b)%(2*a)==0)
	 {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]*(-b)/(2*a)>0)?'+':'-')<<abs(v[i]*(-b)/(2*a))<<")(";
	       if (abs(a/v[i])!=1) cout<<a/v[i];
	       else if (a/v[i]==-1) cout<<'-';
	       cout<<'x'<<((-1*a/v[i]*(-b)/(2*a)>0)?'+':'-')<<abs(a/v[i]*(-b)/(2*a))<<")";
	    }
    else cout<<-1;
		}
     else { x1=(-b+sqrt(de));
	    x2=(-b-sqrt(de));
	    for(i=0, nr=0;i<n;i++)
	      if(-1*v[i]*x1/(2*a)<-1*v[i]*x2/(2*a))
	     {//cout<<v[i]*x1<<' '<<a/v[i]*x2<<endl;

	      if(((long)(v[i]*x1))%(2*a)==0 && ((long)(a/v[i]*x2))%(2*a)==0)
			{nr++; if(nr==k) {aux=1;break;}}
	       //cout<<v[i]*x2<<' '<<a/v[i]*x1<<endl;
	       if(((long)(v[i]*x2))%(2*a)==0 && ((long)(a/v[i]*x1))%(2*a)==0)
//	      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)
			if(((long)(v[i]*x2))%(2*a)==0 && ((long)(a/v[i]*x1))%(2*a)==0)
			{nr++; if(nr==k) {aux=2;break;}}
//	      if((long)(v[i]*x1)==v[i]*x1 && (long)(a/v[i]*x2)==a/v[i]*x2)
		 if(((long)(v[i]*x1))%(2*a)==0 && ((long)(a/v[i]*x2))%(2*a)==0)
		{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/(2*a)>0)?'+':'-')<<abs(v[i]*x1/(2*a))<<")(";
		       if (abs(a/v[i])!=1) cout<<a/v[i];
			else if(a/v[i]==-1) cout<<'-';
			cout<<'x'<<((-1*a/v[i]*x2/(2*a)>0)?'+':'-')<<abs(a/v[i]*x2/(2*a))<<")";
		      }
		       else
		       {cout<<'(';
			if (abs(v[i])!=1) cout<<v[i] ;
		       else if (v[i]==-1) cout<<'-';
			cout<<'x'<<((-1*v[i]*x2/(2*a)>0)?'+':'-')<<abs(v[i]*x2/(2*a))<<")(";
		       if (abs(a/v[i])!=1) cout<<a/v[i];
			else if(a/v[i]==-1) cout<<'-';
		       cout<<'x'<<((-1*a/v[i]*x1/(2*a)>0)?'+':'-')<<abs(a/v[i]*x1/(2*a))<<")";
		       }

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