\(solution\)
- 考虑连链为环,开一个虚点\(n+1\),并连接无向边\((1,n+1),(n,n+1)\),于是原图变成了一个环
- 注意到这样下来每个人任意选择位置,任意选择方向最终都会停留在环的一些位置上,我们把这些位置当作集合\(S\)
- 那么方案不合法当且仅当\(n + 1 \in S\)
- 考虑这个环每个位置完全等价,所以所有\(S\)出现的概率都相等,于是有\(\frac{\binom{n}{m}}{\binom{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\n",1ll * qpow(2,m) * qpow(n+1,m-1) % mod * (n - m + 1) % mod);
return 0;
}