(solution)
- 考虑连链为环,开一个虚点(n+1),并连接无向边((1,n+1),(n,n+1)),于是原图变成了一个环
- 注意到这样下来每个人任意选择位置,任意选择方向最终都会停留在环的一些位置上,我们把这些位置当作集合(S)
- 那么方案不合法当且仅当(n + 1 in S)
- 考虑这个环每个位置完全等价,所以所有(S)出现的概率都相等,于是有(frac{inom{n}{m}}{inom{n+1}{m}})的概率合法
- 不考虑合法,总方案是(2 ^ m * (n + 1) ^ m)
- 乘起来即可
代码非常短
#include<bits/stdc++.h>
using namespace std;
int read(){
char c = getchar();
int x = 0;
while(c < '0' || c > '9') c = getchar();
while(c >= '0' && c <= '9') x = x * 10 + c - 48,c = getchar();
return x;
}
const int mod = 1e9 + 7;
int qpow(int x,int y){
int ans = 1;
while(y){
if(y & 1) ans = 1ll * ans * x % mod;
x = 1ll * x * x % mod;
y >>= 1;
}
return ans;
}
int main(){
int n = read(),m = read();
printf("%lld
",1ll * qpow(2,m) * qpow(n+1,m-1) % mod * (n - m + 1) % mod);
return 0;
}