codeforces 838D D.Airplane Arrangements 思维构造+排列组合

本文探讨了一个航空公司座位分配问题,乘客按票号顺序登机并寻找空位坐下,若找不到则发生冲突。通过将问题转化为环形结构,利用组合数学原理推导出合法座位分配方案的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考网上唯一一发题解  感谢!


题目链接


题意:


航空公司卖机票。飞机座位是1~n的,卖m张票,m小于等于n,每张票上有三个信息,票号 i,座位号 j,登机入口

k,登机入口指的是从机头进入或者是从机尾进入。

乘客登飞机规则:

1. 乘客按照机票的编号从小到大依次登机。

2. 乘客登飞机时,从票上指定的入口进入,径直走到自己的位置处,如果有人,就看下一个位置有没有人,直到找

到第一个空座位,便入座,如果一直走到头都没有位置,该乘客就会暴走。

航空公司想知道它有多少种印票方式,使得乘客不暴走。其中,票上的座位号可以重复。两种印票方式不同当且仅

当两套票中存在票号为 i 的票,票上的信息不完全一样。



思路:

这个题自己想了好久,还和别人讨论过,但是吧还是不太好想,最后还算是说服了自己吧.大牛们千篇一律得出同样的

式.

这个题目的一堆条件确实让我感到了蒙蔽, 首先还要考虑进入的方向,编号,还有重叠的,感觉无法下手.

我们可以知道从前门进入一直走到后门没找到位置,和从后门进入一直走到前门没找到位置是等价的.我们可以设置

一个虚拟的位置,这样就构成一个有n+1个位置的环,那么前门后门进入就可以想象成顺时针和逆时针,起点都是那个没

座的位置。那么我们知道所有可能的印票数位2^m * (n+1)^m. 2 ^ m 是由于左右方向.这其中还包含非法的,那么我们

要把非法的减掉,非法的就是1个人没座 2个人没座 3个人没座....m个没座(当然m个实际不存在).那么环上要使某一个

特定位置为空的情况占总情况数的: (n-m+1)/(n+1) 约分得到最后结果为: 2^m *(n+1)^(m-1)*(n+1-m)

其实把公式展开 (2(n+1))^m-2^m*(n+1)^(m-1)*C(m,1).

因为非法的其实就是保证至少有一个人坐在虚拟位置,那么就是C(m,1) 保证至少一人坐在虚拟位置,其余的人随

便坐,那么就有2^m*(n+1)^(m-1)*C(m,1).


#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
ll qmod(ll a,ll b)
{

    ll res = 1;
    while(b)
    {
        if(b&1)
            res = res * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}

int main()
{

    ll n,m;
    scanf("%lld %lld",&n,&m);
    ll ans = qmod(2 ,m) * qmod(n + 1,m - 1) % mod * (n- m + 1) % mod;
    printf("%lld\n",ans % mod);
    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Marcus-Bao

万水千山总是情,只给五角行不行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值