CF838D

不妨先对题目进行如下转化: 把座位首尾相接排成一个圈,$1$ 号座位与 $n$ 号座位之间用一个编号为 $n+1$ 的座位进行间隔,求一种方案使得没有人座到 $n+1$ 的位置上去。

由于座位之间本质是相同的,故而有:

  1. 一个人从任意一个起点选择任意一个方向的方案数是 $(2(n+1))^m$。
  2. 每个座位没被占据的概率相同,都是 $\frac{n+1-m}{n+1}$。

前者乘以后者就是答案。

  • Q:$n+1$ 作为起点的方案在上述做法中没有去掉,会不会导致多算了?

    A:显然他是不合法的,不会算进最终的答案中。

#include <bits/stdc++.h>
#define FL(i, a, b) for(int i = (a); i <= (b); i++)
#define FR(i, a, b) for(int i = (a); i >= (b); i--)
using namespace std;
const int N = 1e5 + 10, p = 1e9 + 7;
int n, m;
int qpow(int a, int b){
    int ans = 1;
    for(; b; b >>= 1, a = 1ll * a * a % p)
        if(b & 1) ans = 1ll * ans * a % p;
    return ans;
}
int inv(int x){return qpow(x, p - 2);}
int main(){
    scanf("%d%d", &n, &m);
    printf("%lld\n", 1ll * (n + 1 - m) * inv(n + 1) % p * qpow(2 * (n + 1), m) % p);
    return 0;
}
posted @ 2023-07-31 12:50  徐子洋  阅读(11)  评论(0)    收藏  举报  来源