비트 Batch
Time limit | Memory limit | # of submissions | # of submitted users | Solved # | Accepted user ratio |
---|---|---|---|---|---|
2000 ms | 512 MiB | 10 | 6 | 4 | 66.67% |
시간이 많은 그는 $N$개의 비트(0
또는 1
을 가질 수 있는 변수)를 조작하는 일을 반복하고 있다. 지금까지 하던 것이 식상해진 그는 새로운 규칙으로 $N$개의 비트를 조작하려고 한다. 한 번의 조작이란 다음과 같은 작업을 의미한다.
- 비트 중에서
0
인 것들을 먼저,1
인 것들을 나중에 놓는 방식으로 일렬로 늘어 놓는다. 즉 오름차순(엄밀히 비내림차순) 정렬한다. - 그 다음 $1$ 이상 $N$ 이하의 정수 $K$개($K$는 홀수)를 무작위로 뽑는다. 각 정수를 뽑을 확률은 모두 독립적으로, 같은 정수가 두 번 이상 뽑힐 수도 있으며, $1$부터 $N $까지의 각 자연수가 뽑힐 확률은 모두 동일하다.
- 뽑힌 $K $개의 정수 각각에 대해서 정수가 $i $라면 $i $번째 비트를 토글한다. 즉,
0
이면1
로,1
이면0
으로 바꾼다.
예를 들어, 그가 가진 비트가 0,1,0
이고 $K = 3$이라고 해보자.
- 먼저 비트를 정렬하여
0,0,1
로 만든다. - $K = 3$개의 정수를 뽑아 $1,3,1$순서대로 뽑혔다고 해보자.
- 첫 번째 정수 $1$에 의해서 비트는
1,0,1
이 된다. 두 번째 정수 $3$에 의해서 비트는1,0,0
이 된다. 세 번째 정수 $1$에 의해서 비트는0,0,0
이 된다.
위의 과정에서 알 수 있듯, 사실 비트의 순서가 어떻게 되어있는지는 크게 중요한 것이 아니고 개수가 중요하다. 그는 조작을 한 후에 모든 비트가 1
이 되면 조작을 끝내고 자러 갈 것이다. 현재 비트 중에서 0
인 것의 개수가 $z$개일 때 모든 비트를 1
로 만들기 위한 조작 횟수의 기댓값을 구하는 프로그램을 작성하라.
입력
첫 번째 줄에는 비트의 개수와 뽑게 되는 정수의 개수를 의미하는 두 자연수 $N, K$가 공백으로 구분되어 주어진다. $K$는 홀수이다.
부분문제
부분문제 | 점수 | N | K |
---|---|---|---|
1 | 9 | 1 ≤ N ≤ 100 | K = 1 |
2 | 91 | 1 ≤ N ≤ 100 | 0 ≤ K ≤ 109 |
출력
$N$개의 줄에 걸쳐 답을 출력한다. $z$번째 줄에는 현재 비트 중에서 0
인 것의 개수가 $z$개일 때 모든 비트를 1
로 만들기 위해 필요한 조작 횟수의 기댓값을 출력한다. 정확한 판별을 위해, 답을 기약분수로 나타내었을 때 가 된다면, 을 대신 출력하도록 한다. $b^{-1}$은 $b$의 모듈러 곱셈에 대한 역원이다. 이 문제에서는 답이 존재하는 것이 확인된 입력만 들어온다.
입출력 예제
예제 1
입력
1 1
출력
1
예제 2
입력
2 1
출력
3
4
예제 3
입력
5 99
출력
812420891
724220653
692773316
452277443
513756160
Problem Source