//2005.3 Hangzhou
#ifndef polyequation_header
#define polyequation_header
#include
#include
#include
#include
#define maxResult 1e10
#define minResult -1e10
#define EPSILON 1E-6
Using namespace std;
Template
Class Polyequation
{
PUBLIC:
Polyequation (int _n): n (_n)
{
Coe.Rserve (N 1);
}
Template
Polyequation (Const T1 & PVAL, INT _N): N (_n)
{
Coe.Rserve (n 1);
For (int i = 0; i { Coe.push_back (pval [i]); } } T getValue (t _val) { T TMP1 = 0; For (int i = 0; i { T TMP2 = 1.0; For (int J = 0; j
{ TMP2 * = _ VAL; } TMP1 = CoE [N-I] * TMP2; } Return TMP1; } Polyequation { Assert (n> 1); Vector For (int i = 0; i { TMP1.PUSH_BACK (COE [i] * (n-i)); } Return Polyequation } Vector { Vector IF (n == 0) { Return TMP1; } IF (n == 1) { IF (CoE [0]! = 0) { TMP1.PUSH_BACK (COE [1] / Coe [0]); } Return TMP1; } IF (n == 2) { IF (CoE [0]! = 0) { IF ((COE [1] * Coe [1] -CoE [0] * CoE [2] * 4.0)> = 0) { TMP1.PUSH_BACK ((- CoE [1] SQRT (CoE [1] * Coe [1] -CoE [0] * CoE [2] * 4.0)) / (2.0 * CoE [0])); TMP1.PUSH_BACK ((- Coe [1] -sQRT (CoE [1] * CoE [1] -CoE [0] * CoE [2] * 4.0)) / (2.0 * CoE [0])); } } Else { Vector TMP2.PUSH_BACK (COE [1]); TMP2.PUSH_BACK (COE [2]); POLYEQETION Return Tmp3.GetRealsolve (); } Return TMP1; } VECTOR INT N2 = TMP2.SIZE (); IF (n2> 0) { Sort (Tmp2.begin (), TMP2.END ()); Divsol (MinResult, TMP2 [0], TMP1); DivSol (TMP2 [N2-1], MaxResult, TMP1); IF (n> 1) { For (int i = 0; i { Divsol (TMP2 [i], TMP2 [i 1], TMP1); } } } Else { Divsol (MinResult, MaxResult, TMP1); } Return TMP1; } Void Divsol (T Val1, T Val2, Vector { IF (FABS (Val2-Val1) { Res.push_back (VAL1); Return; } T TMP1 = GetValue (VAL1); T TMP2 = GetValue (VAL2); T TMP3 = GetValue ((Val1 VAL2) / 2.0); IF (FABS (TMP1) { Res.push_back (VAL1); Return; } IF (FABS (TMP2) { Res.push_back (VAL2); Return; } IF ((TMP1> 0 && TMP2> 0) || (TMP1 <0 && TMP2 <0))) { Return; } IF (FABS (TMP3) { Res.push_back ((VAL1 VAL2) / 2.0); Return; } IF ((TMP1> 0 && TMP3 <0) || (TMP1 <0 && TMP3> 0))) { Divsol (VAL1, (VAL1 VAL2) / 2.0 ,RES); } IF ((TMP2> 0 && TMP3 <0) || (TMP2 <0 && TMP3> 0))))) { Divsol (VAL2, (VAL1 VAL2) / 2.0 ,RES); } } Private: Int n; Vector } #ENDIF