#agc045d. [agc045_d]Lamps and Buttons

[agc045_d]Lamps and Buttons

问题描述

我们有 NN 盏灯,编号为 11NN,以及 NN 个按钮,编号为 11NN。最初,灯 1,2,cdots,A1,2,\\cdots, A 是开着的,其他灯是关着的。

Snuke 和 Ringo 将进行以下游戏。

  • 首先,Ringo 生成一个排列 (p1,p2,cdots,pN)(p_1,p_2,\\cdots,p_N),它是 (1,2,cdots,N)(1,2,\\cdots,N) 的所有 N!N! 种可能排列之一,并且每种排列被选中的概率相等,而不会告知给 Snuke。

  • 然后,Snuke 可以任意次数地执行以下操作:

    • 选择一盏此刻是开着的灯。(如果没有这样的灯,则无法执行操作。)设选中的灯是第 ii 盏灯。按下按钮 ii,它会改变灯 pip_i 的状态。也就是说,如果灯 pip_i 是开着的,按下按钮后它将关闭;如果灯 pip_i 是关着的,按下按钮后它将打开。

在任何时刻,Snuke 都知道哪些灯是开着的。当所有灯都是开着的时候,Snuke 获胜;当他发现自己无法获胜时,他会放弃。当 Snuke 能够以最佳方式玩游戏时,他获胜的概率是多少?

ww 是获胜的概率。那么,wtimesN!w \\times N! 是一个整数。计算 wtimesN!w \\times N!(109+7)(10^9+7) 取模的结果。

约束条件

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

输入

输入以标准输入格式给出,格式如下所示:

NN AA

输出

打印 wtimesN!w \\times N!(109+7)(10^9+7) 取模的结果,其中 ww 是 Snuke 获胜的概率。


示例输入 1

3 1

示例输出 1

2

首先,Snuke 按下按钮 11。如果灯 11 关闭,他就会失败。否则,他将按下可以按下的按钮。如果剩下的灯打开,他获胜;如果灯 11 关闭,他就会失败。这个游戏中获胜的概率是 1/31/3,所以我们应该打印 (1/3)times3!=2(1/3)\\times 3!=2


示例输入 2

3 2

示例输出 2

3

示例输入 3

8 4

示例输出 3

16776

示例输入 4

9999999 4999

示例输出 4

90395416