그냥 하는 노트와 메모장

BOJ 12977 - 원 위의 점 본문

Solved problems

BOJ 12977 - 원 위의 점

coloredrabbit 2019. 11. 22. 18:18

* 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;
}


'Solved problems' 카테고리의 다른 글

CS Academy - Substring restrictions  (0) 2020.01.21
BOJ 1056 - 수  (2) 2020.01.20
온코더 제12회차 3번 문제 '격자 칠하기' 풀이  (0) 2019.11.12
BOJ 2176 합리적인 이동경로  (0) 2019.08.07
BOJ 17242 Kaka & Bebe  (0) 2019.06.24
Comments