Page **2** of **2**

Posted: **Mon Apr 18, 2005 3:32 am**

by **Antonio Ocampo**

Hi david, you have to delete your code in your previous post.

About

Code: Select all

```
I changed the code to avoid printing -0.000, switched back to doubles (instead of long doubles) and got AC.
```

These are frequent troubles in our source codes.

Keep posting

### 10834 - The Story of Two Coins. Help, please!

Posted: **Sat Apr 30, 2005 7:47 pm**

by **Victor Barinov**

Hello everybody!

I can not understand what is wrong with my code. I always get WA. Maby anyone give me some tests or hints?.

Thanks!

Here is my code:

Code: Select all

```
#include <stdio.h>
#include <math.h>
#define Pi 3.1415926535897932384626433832795
#define eps 1e-8
int main()
{
int cas = 0;
double R, r, tx, ty, px, py;
double alpha, gamma, phi1, phi2;
while (1)
{
scanf("%lf%lf%lf%lf", &R, &r, &tx, &ty);
if (r == 0.0 && R == 0.0) break;
cas++;
printf("Case %d:\n", cas);
if (tx*tx + ty*ty - R*R <= eps || tx*tx + ty*ty - (R+2.0*r)*(R+2.0*r) >= -eps) {
printf("IMPOSSIBLE\n"); continue; }
alpha = acos(tx / sqrt(tx*tx + ty*ty));
if (ty < 0) alpha = 2.0*Pi - alpha;
gamma = acos( (R*R + tx*tx + ty*ty + 2.0*R*r) / (2.0*(R+r)*sqrt(tx*tx + ty*ty)) );
phi1 = alpha - gamma; if (phi1 < 0.0) phi1 += 2.0*Pi;
phi2 = alpha + gamma;
if (phi1 > phi2) {
alpha = phi1;
phi1 = phi2;
phi2 = alpha;
}
px = (R+r-r*sin(phi1*R/r))*cos(phi1) - r*cos(phi1*R/r)*sin(phi1);
py = (R+r-r*sin(phi1*R/r))*sin(phi1) + r*cos(phi1*R/r)*cos(phi1);
if (px < 0.0 && px > -0.0005) px = 0.0;
if (py < 0.0 && py > -0.0005) py = 0.0;
printf("%.3lf %.3lf\n", px, py);
px = (R+r-r*sin(phi2*R/r))*cos(phi2) - r*cos(phi2*R/r)*sin(phi2);
py = (R+r-r*sin(phi2*R/r))*sin(phi2) + r*cos(phi2*R/r)*cos(phi2);
if (px < 0.0 && px > -0.0005) px = 0.0;
if (py < 0.0 && py > -0.0005) py = 0.0;
printf("%.3lf %.3lf\n", px, py);
}
return 0;
}
```

### hmm

Posted: **Sun May 01, 2005 4:27 am**

by **shahriar_manzoor**

I am at a PC now which does not have a C/C++ compiler so I could not check. But does your program consider the following line

"The coordinates of P should be printed in chronological order (If a position is reached by the second coin before the other position then the corresponding coordinates of P should be printed first)."

Posted: **Fri Nov 03, 2006 1:42 pm**

by **filipius**

Hi,

You made this question a long time ago, but I used your code to understand what was wrong with mine. Finally, I got accepted and in the process I found your bug (well, at least one bug - and, of course you may have found it already, but this can help someone else):

In same cases, your angle phi2 is larger than 2 * pi.

This makes a difference in the position of P, because the coins have different sizes.

For instance, consider the following input:

830 714 1892.70526225 -288.736962726

your program's wrong output:

1404.649 -39.541

801.511 390.331

correct output:

1204.633 959.680

1404.649 -39.541

You must normalize your angles.

Cheers,

Filipe Araujo.

Univ. of Coimbra

Portugal