分析
我们考虑计算总方案数乘上合法的概率。然而这样子并不好计算,考虑一些转化。
我们加一个位置 $n+1$,然后把飞机看成一个环,问题变为每个人随机一个初始位置和方向,走到第一个空位停下,如果停在 $n+1$ 就不合法。
这样子最后的每种座位情况都是等概率的,那么 $n+1$ 上有人的概率为 $\frac{m}{n+1}$,即合法概率为 $\frac{n+1-m}{n+1}$,总方案数为 $\left[2(n+1)\right]^m$。
代码
// ====================================
// author: M_sea
// website: https://m-sea-blog.com/
// ====================================
#include <bits/stdc++.h>
#define file(x) freopen(#x".in","r",stdin); freopen(#x".out","w",stdout)
using namespace std;
typedef long long ll;
int read() {
int X=0,w=1; char c=getchar();
while (c<'0'||c>'9') { if (c=='-') w=-1; c=getchar(); }
while (c>='0'&&c<='9') X=X*10+c-'0',c=getchar();
return X*w;
}
const int mod=1e9+7;
int qpow(int a,int b) { int c=1;
for (;b;b>>=1,a=1ll*a*a%mod) if (b&1) c=1ll*c*a%mod;
return c;
}
int main() {
int n=read(),m=read();
printf("%d\n",1ll*(n+1-m)*qpow(n+1,mod-2)%mod*qpow(2*(n+1),m)%mod);
return 0;
}