BOJ 12977 - 원 위의 점
* BOJ 12977 - 원 위의 점
[ 분류 - 조합, 확률 ]
원호(circular arc)는 (각도)x(반지름)으로 정의됩니다. 즉 그 각도만큼 비례하게 되죠.
따라서 한 점을 골랐을 때 그 점이 p각호을 가지는 원호 A에 있을 확률은 p/360가 됩니다. N개의 점 모두 독립적으로 선택되므로 독립확률이구요.
P[1개의 점이 A 내에 있을 확률] = p/360
N개의 점은 모두 서로 다른 점으로 유추할 수 있습니다. 원호는 이산(discrete)값이 아니라 연속값이기 때문에 중복 선택에 대한 의미가 없습니다. 즉 N개의 점을 모두 같은 위치를 선택하는 확률은 서로 다른 점 N개를 선택하는 경우에 대해 0이라고 보기 때문이죠(선 위에 있는 한 점의 길이는 0으로 보는 것처럼).
원호에 존재하는 점의 수를 K개라고 해봅시다. 그러면 원호 위의 한 점을 고를 확률은 1/K가 됩니다. 여기서 이 한 점을 시계방향으로 그 각도가 p가 되게끔 하는 원호를 그려봅시다. 즉 원호의 시작점이 되는 셈인데, 정해진 시작점에 대해 단 하나만 원호가 나올 수 있어요. 따라서 점의 개수=p각도를 가지는 원호의 개수=K가 됩니다. 또 원호 위의 한 점을 고르는 경우의 수는 n(서로 다른 n개의 점)개 이므로, 원호를 고르는 경우의 수는 1/K * K * n = n이 됩니다.
시작점이 고정된 상태에서 n-1개가 원호 내에 들어오면 되므로 n(p/360)^n-1의 확률을 가지게 됩니다. 이 값을 문제에서 원하는 형태로 변경해서 출력해주면 됩니다 :)
n이 1일 경우 어떤 각도로든 원을 생성할 수 있고, n이 2이고 각도가 180인 경우에 역시 어떠한 경우에도 포함될 수 있기 때문에 확률은 1이 됩니다.
- 코드
#include <cstdio> #include <cmath> int main() { int n, p; double ans; scanf("%d%d", &n, &p); if (n == 1 || (n == 2 && p == 180)) ans = 0; else { ans = (n-1) * (log2(360) - log2(p)) - log2(n); } printf("%.6lf", ans + 1e-9); return 0; }