题解 | #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();
    }
}
全部评论

相关推荐

看到这个内容真是闹麻了。。。。。。现在有了AI以后很多人面试都会作弊吗?&nbsp;那对老老实实面试的人岂不是不公平....
重生之我要干前端:放宽心,作弊很明显的,面试官也不是傻子,而且这世上更多的肯定是依靠自己的知识的人,所以放宽心提升自己最重要
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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