일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Segment Tree
- Shortest path
- BOJ
- Algospot
- Dag
- Euler path
- BFSDFS
- backtracking
- mathematics
- POJ
- DynamicProgramming
- CS Academy
- hashing
- GCD
- graph modeling
- Sieve_of_Eratosthenes
- Eulerian path
- bitmask
- dynamic programming
- flows
- Cycle detecting
- graph
- BST
- disjoint-set
- Greedy
- scc
- 백준
- implementation
- Euler circuit
- Eulerian circuit
- Today
- Total
그냥 하는 노트와 메모장
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; }
'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 |