Electron Cloud

 

Electron Cloud

Time Limit: 2 Seconds      Memory Limit: 65536 KB

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.

Electron Cloud

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 X1Y1Z1R1X2Y2Z2 and R2, describing the coordinates and the radiuses of the two atoms. The absolute value of each coordinate do not exceed 100 and 0 < R1R2 ≤ 100.

Output

For each test case, output the volume of space where the electrons may occur, accurated to the nearest 0.01.

Sample Input

 

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>

#include < math.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 ;

} 

 

你可能感兴趣的:(cloud)