V=∫lrπf2(x)dx
在f(x)是多项式情况下
∫lrf(x)dx=∑i=0naii+1(ri+1−li+1)
推出以上然后就可以做了,第二部分可以二分做
(代码很丑,是打广工训练的时候“抢”时间写的……)
#include<stdio.h>
#define eps 0.000001
double a[23],b[23],xlow,xhigh,inc,l,r,mid;
int T,n,cs;
double pow(double a,int b)
{
double rt=1;
while (b--) rt*=a;
return rt;
}
inline double V(double x)
{
double rt=0;
for (int i=0;i<=2*n;i++) rt+=3.1415926535*b[i]/(i+1)*(pow(x,i+1)-pow(xlow,i+1));
return rt;
}
inline void prepare()
{
for (int i=0;i<=20;i++) b[i]=0;
}
int main()
{
while(~scanf("%d",&n))
{
cs++;
prepare();
for (int i=0;i<=n;i++) scanf("%lf",a+i);
for (int i=0;i<=n;i++) for (int j=0;j<=n;j++) b[i+j]+=a[i]*a[j];
scanf("%lf%lf%lf",&xlow,&xhigh,&inc);
printf("Case %d: ",cs);
printf("%.2f\n",V(xhigh));
double fxxk=xlow;
for (int i=1;i<=8;i++)
{
l=xlow;r=xhigh;
for (mid=(l+r)/2;l+eps<r;mid=(l+r)/2) if (V(mid)<inc) l=mid;else r=mid;
if (l+eps<xhigh || inc<eps+V(l)) printf("%.2f ",(xlow=l)-fxxk);
else
{
if (i==1) printf("insufficient volume");
break;
}
}
puts("");
}
}