Cod sursa(job #175426)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 9 aprilie 2008 22:20:40
Problema Ecuatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <stdio.h>
#include <math.h>
#include <stdlib.h> 
#define inf 1000000000
#define sMax 32000

long long a,b,c,k,r,delta,l1,l2;
long long d1[sMax];
long long q,x1,x2,i,sol=0,p1[sMax],q1[sMax],ind[sMax],p2,q2;

int comp(const void * n1,const void * n2){
    if (p1[*((long*)n1)]<p1[*((long*)n2)])return -1;
    else if (p1[*((long*)n1)]>p1[*((long*)n2)])return 1;
         else if (q1[*((long*)n1)]<q1[*((long*)n2)]) return -1;
              else return 1;
}

int  main(){
     freopen("ecuatie.in","r",stdin);
     freopen("ecuatie.out","w",stdout);
     
     scanf ("%lld %lld %lld %lld",&a,&b,&c,&k);

     delta=(long long)b*b-4*a*c;
     r=sqrt((long double)delta);
     if ((long long)r*r!=delta){printf("-1\n");return 0;}
     x1=-b-r;
     x2=-b+r;
     
     r=sqrt(a);
     q=0;
     if (r*r==a){
        for (i=1;i<r;i++)
         if (a%i==0){d1[++q]=i;d1[++q]=a/i;}
         d1[++q]=r;
     }
     else for (i=1;i<=r;i++)
              if (a%i==0){d1[++q]=i;d1[++q]=a/i;}
     if (q>5000)while (1);
     for (i=1;i<=q;i++){
         sol++;
         p1[sol]=-d1[i];
         q1[sol]=x1*d1[i]/(2*a);
         //p2[sol]=-a/d1[i];
         //q2[sol]=x2*a/d1[i]/(2*a);
         sol++;
         p1[sol]=-d1[i];
         q1[sol]=x2*d1[i]/(2*a);
         //p2[sol]=-a/d1[i];
         //q2[sol]=x1*a/d1[i]/(2*a);
         sol++;
         p1[sol]=d1[i];
         q1[sol]=-x1*d1[i]/(2*a);
         //p2[sol]=a/d1[i];
         //q2[sol]=-x2*a/d1[i]/(2*a);
         sol++;
         p1[sol]=d1[i];
         q1[sol]=-x2*d1[i]/(2*a);
         //p2[sol]=a/d1[i];
         //q2[sol]=-x1*a/d1[i]/(2*a);
     }
     for (i=1;i<=sol;i++)ind[i]=i;
     qsort(ind+1,sol,sizeof(long long),comp);
     for (i=1;i<=sol;i++){
         printf("%lld %lld %lld ",p1[ind[i]],q1[ind[i]],p2=a/p1[ind[i]]);
         if (q1[ind[i]]==-x1*p1[ind[i]]/(2*a))q2=-x2*p2/(2*a);
         else q2=-x1*p2/(2*a);
         printf("%lld\n",q2);
     }
          
     return 0;
}