CF838D Airplane arrangement

  • 原题链接:CF838D
  • 感觉很妙的一道组合数学题

\(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;
}
posted @ 2021-05-06 21:21  y_dove  阅读(94)  评论(0编辑  收藏  举报