题解 | #biubiubiu坐地铁#

biubiubiu坐地铁

https://ac.nowcoder.com/acm/problem/25193

思路

考虑用动态规划解决这个问题。

为有 个座位最后坐下的期望人数。

当有 个座位时,第 个人有 种选择,可以选择第 个座位坐下。

当第 个人在第 个座位坐下后,第 个人的左边就有 个座位可以坐,对应的期望人数可以表示为 ,右边有 个座位可以坐,对应的期望人数为 ,因此,第 个人坐在第 个座位的情况下,最后坐下的期望人数为

因为第 个人是在 个座位随机选择一个坐下,所以第 个人坐到第 个座位的概率为

因为第 个座位有从 种情况,所以最后坐下的期望人数为

因为 ,所以 ,且 ,显然,当座位数量不为正数时,坐下人数必然为 ,所以有效范围实则为 则可以变式为

复杂度

时间复杂度和空间复杂度均为

代码实现

// Problem: biubiubiu坐地铁
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/problem/25193
// Memory Limit: 2 MB
// Time Limit: 25193000 ms
//
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
using namespace std;

#define int long long

const int N = 1e6 + 5, mod = 1e9 + 7;

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

int inv(int x)
{
    return qmi(x, mod - 2);
}

int n;
int f[N], g[N];

void solve()
{
    cin >> n;
    f[1] = f[2] = 1;
    for (int i = 1; i <= n; i++) {
        if (i > 2)
            f[i] = (i + 2 * g[i - 2]) % mod * inv(i) % mod;
        g[i] = (g[i - 1] + f[i]) % mod;
    }
    cout << f[n];
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    int T = 1;
    // cin >> T;
    while (T--) {
        solve();
    }
}
全部评论

相关推荐

鼠鼠第一次实习,啥也不懂一直是自己一个人吃的饭,不会做工作老是被嫌弃,大人的世界是这样的吗?
我是星星我会发亮:好的mt有两种,一种愿意教你的,一种几乎什么活都不给你派让你很闲允许你做自己事情的
点赞 评论 收藏
分享
06-23 11:28
门头沟学院 Java
牛客919661971号:也有可能是点拒绝的时候自动弹的话术
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务