Codeforces

Luogu

分析

我们考虑计算总方案数乘上合法的概率。然而这样子并不好计算,考虑一些转化。

我们加一个位置 $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;
}
最后修改:2020 年 08 月 25 日 05 : 26 PM