HarmoniikaaHarmoniikaa HDU 1724

辛普森自适应积分法模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using namespace std;
int T;
double a,b;
double (double x){
return sqrt((1-(x*x)/(a*a))*(b*b));
}
double simpson(double a,double b){
double c=(a+b)/2.0;
return (f(a)+4*f(c)+f(b))*(b-a)/6.0;
}
double asr(double l,double r,double eps,double A){
double c=(l+r)/2.0;
double L=simpson(l,c),R=simpson(c,r);
if(fabs(L+R-A)<=15.0*eps) return L+R+(L+R-A)/15.0;
return asr(l,c,eps/2,L)+asr(c,r,eps/2,R);
}
int main(){
scanf("%d",&T);
while(T--){
int l,r;
scanf("%lf%lf%d%d",&a,&b,&l,&r);
printf("%.3fn",asr(l,r,1e-6,simpson(l,r))*2);
}
return 0;
}