题解 [牛客练习赛62 B] 病毒扩散

病毒扩散

https://ac.nowcoder.com/acm/contest/5205/B

题目描述

题目讲的很清楚,这里就不加赘述了。

正解

考虑病毒扩散的组合意义,把它转化成从 的方案数。

一个点它在一秒内可以进行以下三种操作。

  1. 不动

  2. (往上走

  3. (往右走

至于这样为啥是对的,自己感性理解一下吧,直接讲也不太好讲。

最后答案就是

upd : 证明

考虑暴力更新大小为 的矩阵的过程。

第一项其实就是在这一秒不动,然后第二项是在这一秒往上走,第三项是在这一秒往右边走,对应着上面说的三种操作。

后面答案为啥是那个组合数呢?

我们要求的东西其实是:在 秒内,走 次向上的,走 次向右的,那么这个组合数就自然是没有问题滴。

代码

#include <bits/stdc++.h>
#define N 10000

using namespace std;

const int mod = 998244353;

int n;
int fac[N + 5], ifac[N + 5];

inline int read() {
    int x = 0; char ch = getchar();
    while(!isdigit(ch)) ch = getchar();
    while(isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
    return x;
}

inline int fpm(int x, int y) {
    int r = 1;
    while(y) {
        if(y & 1) r = 1LL * x * r % mod;
        x = 1LL * x * x % mod, y >>= 1;
    }
    return r;
}

inline int perm(int x, int y) { return 1LL * fac[x] * ifac[x - y] % mod; }
inline int comb(int x, int y) { return 1LL * perm(x, y) * ifac[y] % mod; }

int main() {
    fac[0] = 1;
    for(int i = 1; i <= N; ++i) fac[i] = 1LL * i * fac[i - 1] % mod;
    ifac[N] = fpm(fac[N], mod - 2);
    for(int i = N; i; --i) ifac[i - 1] = 1LL * i * ifac[i] % mod;

    n = read();
    for(int i = 1, x, y, t; i <= n; ++i) {
        x = read(), y = read(), t = read();
        if(x + y > t) {
            puts("0");
            continue;
        }

        int ans = 1LL * comb(t, x) * comb(t - x, y) % mod;
        printf("%d\n", ans);
    }
    return 0;
}
全部评论
感性理解可以练出来吗0.0
点赞 回复 分享
发布于 2020-04-24 22:26
这波更新我看懂了,nice!
点赞 回复 分享
发布于 2020-05-01 14:06
中电科金仓
校招火热招聘中
官网直投

相关推荐

点赞 评论 收藏
分享
zxxxxxr:不是挂了,是美团招聘特有机制,三天第一志愿没处理会自动结束跳转到第二志愿,以此类推,只要有人后面捞也会回到第一志愿的
投递美团等公司10个岗位
点赞 评论 收藏
分享
v__v:这种太难的都是kpi面,正缺人想要你就会只考项目和少量算法题,都答的差不多就可以要了。反之,不想要你就会深挖八股文,就算你是chatgpt到深入部分也有答错的时候,就可以借机会给你挂
点赞 评论 收藏
分享
4 收藏 评论
分享
牛客网
牛客企业服务