atcoder#AGC045D. [AGC045D] Lamps and Buttons

[AGC045D] Lamps and Buttons

题目描述

1 1 から N N までの番号のついた N N 個のランプと,1 1 から N N までの番号のついた N N 個のボタンがあります. 最初,ランプ 1,2,,A 1,2,\cdots,A は点灯しており,それ以外のランプは点灯していません.

すぬけくんとりんごさんは,次のようなゲームを行うことにしました.

  • まず,りんごさんが (1,2,,N) (1,2,\cdots,N) の順列 (p1,p2,,pN) (p_1,p_2,\cdots,p_N) を生成する. この順列は N! N! 通りの中から一様ランダムに選ばれる. すぬけくんは,この順列を知らされない.

  • 次に,すぬけくんは,以下の操作を好きなだけ繰り返す.

    • 現在点灯しているランプを 1 1 つ選ぶ(そのようなランプがない場合は操作を行えない). 選んだランプの番号を i i とする. そして,ボタン i i を押す. すると,ランプ pi p_i の状態が反転する.つまり,ランプ pi p_i がもともと点灯しているなら消灯し,もともと点灯していないなら点灯する.

すぬけくんは,常に,どのランプが点灯しているかを知ることができます. すぬけくんの勝利条件は,すべてのランプを点灯した状態にすることです. これが不可能と判明した時点ですぬけくんは負けを認めます. すぬけくんが最適に行動するとき,勝率はいくらでしょうか?

すぬけくんの勝率を w w とした時,w × N! w\ \times\ N! は整数になります. w × N! w\ \times\ N! 109+7 10^9+7 で割ったあまりを求めてください.

输入格式

入力は以下の形式で標準入力から与えられる.

N N A A

输出格式

すぬけくんの勝率を w w とした時,w × N! w\ \times\ N! 109+7 10^9+7 で割ったあまりを出力せよ.

题目大意

NN 盏灯与 NN 个开关,分别从 11NN 标号。起初,前面连续的 AA 盏灯是被点亮的,而后面的灯是被熄灭的。

Snuke 和 Ringo 将要玩下面这个游戏:

  • 首先,Ringo 生成一个 11NN 的排列 (p1,p2,...,pN)(p_1,p_2,...,p_N)。对于所有 N!N! 种可能的排列,每一种的概率都是等价的,而 Snuke 并不知道这个排列是什么。

  • 然后,Snuke 可以做任意次如下操作:

    • 选择一盏已经被点亮了的灯。(如果没有,那么这个操作将不可能被执行。)假设选取了第 ii 盏灯,按下第 ii 盏灯对应的按钮,那么第 pip_i 盏灯的开关状态将会被改变。也就是说,如果第 pip_i 灯是被点亮的,那么操作后它将被熄灭,反之亦然。

每一时刻,Snuke 都可以知道每一盏灯的开关情况。如果最终所有的灯都被点亮了,那么 Snuke 取得游戏胜利;而如果事实证明他无法取得胜利,他就会认输。如果 Snuke 采取最佳策略,那么他胜利的概率是多少呢?

假设 ww 为胜利的概率,那么请输出 w×N!w\times N! 在模 109+710^9+7 意义下的值。

3 1
2
3 2
3
8 4
16776
9999999 4999
90395416

提示

制約

  • 2  N  107 2\ \leq\ N\ \leq\ 10^7
  • 1  A  min(N1,5000) 1\ \leq\ A\ \leq\ \min(N-1,5000)

Sample Explanation 1

すぬけくんはまず,ボタン 1 1 を押します. ランプ 1 1 が消灯した場合はすぬけくんの負けです. そうでないときは,新しく点灯したランプに対応するボタンを押します. ここで残っていたランプが点灯すれば,すぬけくんの勝ちです. 逆に,ランプ 1 1 が消灯した場合,すぬけくんの負けです. このゲームの勝率は 1/3 1/3 なので,(1/3)× 3!=2 (1/3)\times\ 3!=2 を出力します.