2012-05-05 20:13:16Morris

[UVA][二分] 10341 - Solve It

Problem F

Solve It

Input: standard input

Output: standard output

Time Limit: 1 second

Memory Limit: 32 MB

Solve the equation:
        p*e-x + q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0
        where 0 <= x <= 1.

Input

Input consists of multiple test cases and terminated by an EOF. Each test case consists of 6 integers in a single line: p, q, r, s, t and u (where 0 <= p,r <= 20 and -20 <= q,s,t <= 0). There will be maximum 2100 lines in the input file.

Output

For each set of input, there should be a line containing the value of x, correct upto 4 decimal places, or the string "No solution", whichever is applicable.

Sample Input

0 0 0 0 -2 1
1 0 0 0 -1 2
1 -1 1 -1 -1 1

Sample Output

0.7071
No solution
0.7554


#include <stdio.h>
#include <math.h>
#define eps 1e-8

int p, q, r, s, t, u;
double calc(double xn) {
return p*exp(-xn) + q*sin(xn) + r*cos(xn) + s*tan(xn) + t*xn*xn + u;
}
double bsearch() {
double mx, a, b, m;
int test = 50;
a = 0, b = 1;
while(test--) {
m = (a+b)/2;
mx = calc(m);
if(fabs(mx) < eps)
return m;
if(mx > 0) a = m;
else b = m;
}
return -1;
}
int main() {
while(scanf("%d %d %d %d %d %d", &p, &q, &r, &s, &t, &u) == 6) {
if(!p && !q && !r && !s && !t && !u) {
puts("0.0000");
continue;
}
double flag = bsearch();
if(flag == -1) {
puts("No solution");
} else
printf("%.4lf\n", flag);
}
return 0;
}