Electron Cloud
The electron is described in terms of its probability distribution or probability density. This probability distribution does not have definite cutoff points; its edges are somewhat fuzzy. Hence the term "electron cloud." This cloudy probability distribution takes on different shapes, depending on the state of the atom.
![](http://acm.zju.edu.cn/onlinejudge/showImage.do?name=electron_cloud_2_1012.jpg)
In order to describe a nuclear action, you are asked to tell where the electrons may occur.
Here we assume that the electrons only occur within a sphere whose location and radius are given. The action consists of only two atoms.
Input
There are multiple test cases. The first line of input is an integer T indicating the number of test cases. (0 < T ≤ 50)
Each test case consists of a line containing 8 integers X1, Y1, Z1, R1, X2, Y2, Z2 and R2, describing the coordinates and the radiuses of the two atoms. The absolute value of each coordinate do not exceed 100 and 0 < R1, R2 ≤ 100.
Output
For each test case, output the volume of space where the electrons may occur, accurated to the nearest 0.01.
Sample Input
3
0 0 0 1 0 0 2 1
0 0 0 2 0 0 2 2
0 0 0 2 0 0 2 1
Sample Output
8.38
56.55
36.00
Sample code:
#include<stdio.h>
#define PI acos(-1.0)
struct point
{
double x,y,z;
double r;
}p1,p2;
double dis(point a,point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z));
}
double V(double r)
{
return (4.0/3)*PI*r*r*r;
}
double V2(double r,double h)
{
return (2.0/3)*PI*r*r*h-(1.0/3)*PI*(r-h)*(r*r-(r-h)*(r-h));
}
void swap(double &a,double &b)
{
double t;
t=a;
a=b;
b=t;
}
void volumn(point p1,point p2)
{
double d=dis(p1,p2);
if(p1.r<p2.r) swap(p1.r,p2.r);
if(p1.r+p2.r<=d)
printf("%.2f\n",V(p1.r)+V(p2.r));
else if(d<=p1.r-p2.r)
printf("%.2f",V(p1.r));
else
{
double r1=p1.r,r2=p2.r;
double t=(r1*r1-r2*r2)/d;
double h1=(d+t)/2;
double h2=(d-t)/2;
h1=(r1-h1);
h2=(r2-h2);
double ans=V(p1.r)+V(p2.r)-V2(p1.r,h1)-V2(p2.r,h2);
printf("%.2f\n",ans);
}
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
scanf("%lf%lf%lf%lf",&p1.x,&p1.y,&p1.z,&p1.r);
scanf("%lf%lf%lf%lf",&p2.x,&p2.y,&p2.z,&p2.r);
volumn(p1,p2);
}
return 0;
}