Pagini recente » Cod sursa (job #2502846) | Cod sursa (job #604935) | Cod sursa (job #2899325) | Cod sursa (job #59649) | Cod sursa (job #175476)
Cod sursa(job #175476)
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define inf 1000000000
#define sMax 5000
long long a,b,c,k,r,delta,l1,l2;
long long d1[sMax];
long long q,x1,x2,i,sol=0,p1[4*sMax],q1[4*sMax],ind[4*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;}
for (i=1;i<=q;i++){
sol++;
p1[sol]=-d1[i];
if ((x1*d1[i])%(2*a)==0){
q1[sol]=x1*d1[i]/(2*a);
p2=a/p1[sol];
if (q1[sol]==-x1*p1[sol]/(2*a)){
if ((-x2*p2)%(2*a)!=0)sol--;
}
else if ((-x1*p2)%(2*a)!=0)sol--;
}else sol--;
sol++;
p1[sol]=-d1[i];
if ((x2*d1[i])%(2*a)==0){
q1[sol]=x2*d1[i]/(2*a);
p2=a/p1[sol];
if (q1[sol]==-x1*p1[sol]/(2*a)){
if ((-x2*p2)%(2*a)!=0)sol--;
}
else if ((-x1*p2)%(2*a)!=0)sol--;
}
else sol--;
sol++;
p1[sol]=d1[i];
if ((-x1*d1[i])%(2*a)==0){
q1[sol]=-x1*d1[i]/(2*a);
p2=a/p1[sol];
if (q1[sol]==-x1*p1[sol]/(2*a)){
if ((-x2*p2)%(2*a)!=0)sol--;
}
else if ((-x1*p2)%(2*a)!=0)sol--;
}
else sol--;
sol++;
p1[sol]=d1[i];
if ((-x2*d1[i])%(2*a)==0){
q1[sol]=-x2*d1[i]/(2*a);
p2=a/p1[sol];
if (q1[sol]==-x1*p1[sol]/(2*a)){
if ((-x2*p2)%(2*a)!=0)sol--;
}
else if ((-x1*p2)%(2*a)!=0)sol--;
}
else sol--;
}
//printf("%lld\n",sol);
for (i=1;i<=sol;i++)ind[i]=i;
qsort(ind+1,sol,sizeof(long long),comp);
for (i=1,k--;i<=sol&&k;i++,k--){
while (p1[ind[i]]==p1[ind[i+1]]&&q1[ind[i]]==q1[ind[i+1]]&&i+1<=sol)i++;
}
if (k==0){
printf("(");
if (p1[ind[i]]<0)
if (p1[ind[i]]<-1)
printf("%lldx",p1[ind[i]]);
else printf("-x");
else if (p1[ind[i]]>1)
printf("%lldx",p1[ind[i]]);
else printf("x");
if (q1[ind[i]]>0)printf("+%lld",q1[ind[i]]);
else printf("%lld",q1[ind[i]]);
printf(")(");
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);
if (p2<0)
if (p2<-1)
printf("%lldx",p2);
else printf("-x");
else if (p2>1)
printf("%lldx",p2);
else printf("x");
if (q2>0)printf("+%lld",q2);
else printf("%lld",q2);
printf(")\n");
}
else printf("-1\n");
return 0;
}