Cod sursa(job #109420)

Utilizator savimSerban Andrei Stan savim Data 25 noiembrie 2007 11:01:43
Problema Ecuatie Scor 10
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasele 5-8 Marime 1.94 kb
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int nr,m,a,b,c,k,i,j,n;
int v[100],v2[100];
void da()
{
    int i,j,x,t=int(sqrt(a));
    if (t*t==a)
    {
       m=1;
       v[m]=t;
       t--;           
    }
    for (i=1; i<=t; i++)
    if ((a%i)==0)
    {
       m+=2;
       v[m-1]=i;
       v[m]=a/i;             
    }    
	for (i=1; i<=m; i++)
		v[m+i]=-v[i];
	m=m+m;
	for (i=1; i<=m-1; i++)
		for (j=i; j<=m; j++)
			if (v[i]>v[j])
			{
			   x=v[i];
			   v[i]=v[j];
			   v[j]=x;
			}
}
void dc()
{
	int i,j,x,s=c;
	if (s<0) s=s*(-1);
	int t=int(sqrt(s));

	if (t*t==n)
	{
		t--;
		n=1;
		v2[n]=t+1;
	}
	for (i=1; i<=t; i++)
	if ((s%i)==0)
	{
	   n+=2;
	   v2[n-1]=i;
	   v2[n]=s/i;
	}
	for (i=1; i<=n; i++)
		v2[n+i]=-v2[i];
	n=n+n;
	for (i=1; i<=n-1; i++)
		for (j=i; j<=n; j++)
			if (v2[i]>v2[j])
			{
			   x=v2[i];
			   v2[i]=v2[j];
			   v2[j]=x;
			}
}

int main()
{
    
    freopen("ecuatie.in","r",stdin);
    freopen("ecuatie.out","w",stdout);
    
    scanf("%d%d%d%d",&a,&b,&c,&k);        
    da();
    dc();
    if (k>m*n) 
    {
       printf("-1\n");
       return 0;
    }
    nr=0;
    for (i=1; i<=m; i++)
    {
        int p=int(a/v[i]);
        for (j=1; j<=n; j++)
        {
                int q=int(c/v2[j]);
				if (v2[j]*p+v[i]*q==b) nr++;
                if (nr==k)
                {
                   printf("(");
                   if (v[i]==-1) printf("-x");
                   else if (v[i]==1) printf("x");
                        else printf("%dx",v[i]);
				   if (v2[j]<0) printf("%d)",v2[j]);
				   else printf("+%d)",v2[j]);
				   printf("(");
				   if (p==-1) printf("-x");
				   else if (p==1) printf("x");
						else printf("%dx",p);
				   if (q<0) printf("%d)",q);
				   else printf("+%d)",q);
				   return 0;
				}
        }            
            
    }   
	if (nr<k) printf("-1\n");
    return 0;    
}