#include #include #define YES 1 #define NO 0 #define mod(x) ((x<=0)? x*-1:x*1) #define complexmod(a,b) sqrt(a*a+b*b) #define cuberoot(a) (a<0)?(pow(a*-1,((double)1/(double)3))*-1):pow(a,((double)1/(double)3)) int solve_cubic(double ,double ,double ,double ); int solve_quadratic(double ,double ,double ); int solve_linear(double ,double ); double x1=0,x2=0,x3=0,x4=0,x2real=0,x2imaginary=0,imaginary_roots=NO; int main() { double a,b,c,d,e; scanf("%lf %lf %lf %lf %lf",&a,&b,&c,&d,&e); if(a==0) { if(solve_cubic(b,c,d,e)) printf("YES"); else printf("NO"); } else { double f=0,g=0,h=0; b=b/a; c=c/a; d=d/a; e=e/a; a=1; f = c-((3*b*b)/8); g = d+((b*b*b)/8)-((b*c)/2); h = e - ((3*b*b*b*b)/256)+((b*b*c)/16)-((b*d)/4); solve_cubic(1,(f/2), ((f*f-4*h)/16), ((-1*g*g)/64)); { if(imaginary_roots == YES) { double r,x,y,s; r=sqrt(x2real*x2real + x2imaginary*x2imaginary); y = (r-x2real)/2; y=sqrt(y); x = x2imaginary/(2*y); //printf("\n%lf + i%lf, %lf - i%lf",x,y,x,y); r = (-g)/(8*(x*x+y*y)); s= b/(4*a); //printf("\n%lf + i%lf, %lf - i%lf %lf %lf",x,y,x,y,r,s); x1= (2*x) + r - s; x2= -(2*x) + r - s; x2real = -r-s; x2imaginary = 2*y; //printf("\n%lf %lf",x1,x2); //printf("\n%lf + i%lf",x2real,x2imaginary); if(mod(x1)<=1 && mod(x2)<=1 && complexmod(x2real,x2imaginary)<=1) printf("YES"); else printf("NO"); } else { //printf("\n%lf %lf %lf",x1,x2,x3); double p=0,q=0,r=0,s=0; if((int)x1 == 0) { if(x2 != 0 && x3 != 0) { if(x2<=0 || x3<=0) { p = sqrt(mod(x2)); q = sqrt(mod(x3)); imaginary_roots=YES; } else { p = sqrt(x2); q = sqrt(x3); } } } else if((int)x2 == 0) { if(x1 != 0 && x3 != 0) { if(x1<=0 || x3<=0) { p = sqrt(mod(x1)); q = sqrt(mod(x3)); imaginary_roots=YES; } else { p = sqrt(x1); q = sqrt(x3); } } } else if((int)x3 == 0) { if(x2 != 0 && x1 != 0) { if(x2<=0 || x1<=0) { p = sqrt(mod(x2)); q = sqrt(mod(x1)); imaginary_roots=YES; } else { p = sqrt(x1); q = sqrt(x2); } } } else { if(x2<=0 || x1<=0) { p = sqrt(mod(x2)); q = sqrt(mod(x1)); imaginary_roots=YES; } else { p = sqrt(x1); q = sqrt(x2); } } s = b/(4*a); //printf("\n%lf %lf %lf %lf",p,q,r,s); if(imaginary_roots!=YES) { r = (-1*g)/(8*p*q); x1 = p + q + r - s; x2 = p - q - r - s; x3 = (-1*p) + q - r - s; x4 = (-1*p) - q + r - s; printf("\n%lf %lf %lf %lf",x1,x2,x3,x4); if(mod(x1) <=1 && mod(x2)<=1 && mod(x3)<=1 && mod(x4)<=1) printf("YES"); else printf("NO"); } else { r = g/(8*p*q); //printf("\n%lf %lf %lf %lf",p,q,r,s); double v,v1,v2,v3; v=p+q; v1=r-s; v2=p-q; v3=-r-s; printf("\n%lf + i%lf %lf + i%lf",v,v1,v2,v3); if(complexmod(v,v1)<=1 && complexmod(v2,v3)<=1) printf("YES"); else printf("NO"); } } } } return 0; } int solve_cubic(double a,double b,double c,double d) { double f=0,g=0,h=0; if(a==0) { if(solve_quadratic(b,c,d)) return YES; else return NO; } else { f = (((3*c)/a) - ((b*b)/(a*a)))/3; g = (((2*b*b*b)/(a*a*a)) - ((9*b*c)/(a*a)) + ((27*d)/a))/27; h = ((g*g)/4) + ((f*f*f)/27); if(f==0 && g==0 && h==0) { x1=cuberoot((d/a)) * -1; x2=x1; x3=x1; //printf("\n%lf ",x1); if(mod(x1)<=1) return YES; else return NO; } else if(h<=0) { double i=0,j=0,k=0,l=0,m=0,n=0,p=0; i = sqrt((g*g/4) - h); j = cuberoot(i); k = acos (-1*(g /(2*i))); l = j * -1; m = cos (k/3); n = sqrt(3) * sin (k/3); p = (b/(3*a)) * -1; x1 = ((2*j)*cos(k/3))-(b/(3*a)); x2 = (l*(m+n))+p; x3 = (l*(m-n))+p; //printf("\n%lf %lf %lf",x1,x2,x3); if(mod(x1)<=1 && mod(x2)<=1 && mod(x3)<=1) return YES; else return NO; } else if(h>0) { double r=0,s=0,t=0,u=0; //printf("\n%lf %lf %lf",f,g,h); r = (-1*(g/2)) + sqrt(h); s = cuberoot(r); t = (-1*(g/2)) - sqrt(h); u = cuberoot(t); //printf("\n%lf %lf %lf %lf",r,s,t,u); x1 = (s+u)-(b/(3*a)); x2real = ((-1*(s + u))/2) - (b/(3*a)); x2imaginary = ((s-u)*sqrt(3))/2; x2=0; x3=0; imaginary_roots=YES; //printf("\n%lf %lf %lf",x1,x2real,x2imaginary); if(mod(x1)<=1 && complexmod(x2real,x2imaginary)<=1) return YES; else return NO; } } } int solve_quadratic(double a,double b,double c) { if(a==0) { if(solve_linear(b,c)) return YES; else return NO; } else { double d=0; d = (b*b) - (4*a*c); if(d>=0) { double x1=0,x2=0; x1 = ((b*-1) + sqrt(d)) / (2*a); x2 = ((b*-1) - sqrt(d)) / (2*a); if (mod(x1)<=1 && mod(x2)<=1) return YES; else return NO; } else { double x1real=0,x1imaginary=0; d = mod(d); x1real = (b*-1)/(2*a); x1imaginary = (sqrt(d))/(2*a); if(complexmod(x1real,x1imaginary)<=1) return YES; else return NO; } } } int solve_linear(double a,double b) { double x1=0; x1 = (b*-1)/a; if (mod(x1)<=1) return YES; else return NO; }