모바일 게임의 정점이라 할 만한 게임을 하는 한 사람이 어느 날 계약을 체결하려다가 해야 하는 게임 때문에 몹시 화가 났습니다. 게임은 다음과 같이 진행됩니다.
- $1$부터 $2N+K$까지의 수가 적힌 카드로 구성된 카드 풀이 있습니다.
- 게임은 이 카드 풀에서 카드 $N$장을 하나씩 뽑습니다. 뽑은 카드는 돌려놓지 않으므로 같은 수를 두 번 뽑을 수 없습니다.
- 카드를 뽑은 뒤 플레이어는 다음 카드의 수가 더 클지 더 작을지 예측합니다.
플레이어가 화난 이유는 운이 나빠 작은 수 뒤에는 계속 더 작은 수가 나오고, 큰 수 뒤에는 계속 더 큰 수가 나오기 때문입니다. 플레이어는 게임의 무작위 선택 방식을 수정하여 이를 막으려 합니다. 수정된 카드 추첨에는 다음 두 규칙이 추가됩니다.
- $1$부터 $N$까지의 수가 적힌 카드를 뽑았다면 다음에 뽑는 카드의 수는 반드시 $N$보다 커야 합니다($>N$).
- $N+K+1$부터 $2N+K$까지의 수가 적힌 카드를 뽑았다면 다음에 뽑는 카드의 수는 반드시 $N+K+1$보다 작아야 합니다($<N+K+1$).
수정을 마친 플레이어는 게임을 얼마나 망가뜨렸는지 궁금해합니다. 그 정도를 나타내는 척도는 수정된 게임에서 가능한 서로 다른 카드 추첨 순서의 총개수를 원래 게임에서 가능한 카드 추첨 순서의 총개수로 나눈 비율입니다. 플레이어는 이 비율을 $10^9+7$로 나눈 나머지를 여러분에게 묻습니다.
구현 세부사항
다음 함수를 구현해야 합니다.
int oyun(int N, int K)
- $N$과 $K$는 문제에서 설명한 카드 풀과 뽑을 카드의 개수를 결정하는 정수입니다.
- 이 함수는 요구한 비율을 반환해야 합니다.
- 이 함수는 각 테스트에서 정확히 한 번 호출됩니다.
제한
- $1\le N\le 10^6$
- $1\le K\le 100$
서브태스크
| 서브태스크 | 점수 | 추가 제한 | 의존하는 서브태스크 |
|---|---|---|---|
| 1 | 10 | $1\le N,K\le 6$ | — |
| 2 | 18 | $1\le N\le 100$ | 1 |
| 3 | 6 | $1\le N\le 1000$ | 1, 2 |
| 4 | 47 | $1\le N\le 10^4$ | 1, 2, 3 |
| 5 | 19 | 추가 제한 없음 | 1, 2, 3, 4 |
예제
oyun(2, 1)
위 함수 호출은 $600000005$를 반환해야 합니다.
사용하는 수는 $1,2,3,4,5$이며 카드 2장을 뽑습니다. 원래 게임에서는 카드를 뽑는 방법이 20가지입니다. 수정된 게임에서는 첫 카드가 $1,2,4,5$ 중 하나이면 두 번째 카드로 가능한 수가 3가지이고, 첫 카드가 $3$이면 두 번째 카드로 가능한 수가 4가지입니다. 따라서 수정된 게임에서는 총 16가지가 가능합니다. $\frac{16}{20}=\frac45$입니다. 이 확률은 사용하는 모듈러에서 $600000005$와 같습니다.
예제 채점기
예제 채점기는 각 테스트의 입력이 다음 형식일 것으로 기대합니다.
$$N\ K$$
요구한 함수가 정수를 성공적으로 반환하면 그 결과 $R$을 다음 형식으로 출력합니다.
$$R$$