[ABC297F] Minimum Bounding Box 2
  YdxfFsjpYokY 2023年11月02日 117 0


也许更好的阅读体验

[ABC297F] Minimum Bounding Box 2_算法
在一个 [ABC297F] Minimum Bounding Box 2_Code_02[ABC297F] Minimum Bounding Box 2_acm_03 列的网格图上随机选择 [ABC297F] Minimum Bounding Box 2_取模_04 个点。定义当前局面的分数为最小的可以围住这 [ABC297F] Minimum Bounding Box 2_取模_04

请求出所有局面中分数的期望值,输出时对 [ABC297F] Minimum Bounding Box 2_oi_06取模。

[ABC297F] Minimum Bounding Box 2_取模_07
先说经典的容斥方法,考虑围住这[ABC297F] Minimum Bounding Box 2_oi_08个点的矩形的大小为[ABC297F] Minimum Bounding Box 2_算法_09
[ABC297F] Minimum Bounding Box 2_oi_08个点全部落在这个矩形范围内的方案数为[ABC297F] Minimum Bounding Box 2_acm_11
接下来考虑围住[ABC297F] Minimum Bounding Box 2_oi_08个点的最小矩形并不是[ABC297F] Minimum Bounding Box 2_算法_09的方案数
而这种情况下,一定有一条边上没有点
容斥的方法就出来了,每次考虑几条边上没有点然后考虑一下是什么样的情况,如何加减即可

另一种方法是直接推
[ABC297F] Minimum Bounding Box 2_取模_14表示围住[ABC297F] Minimum Bounding Box 2_oi_08个点的矩形大小为[ABC297F] Minimum Bounding Box 2_Code_16的方案数
则很容易有[ABC297F] Minimum Bounding Box 2_Code_17
复杂度是[ABC297F] Minimum Bounding Box 2_算法_18的,对这个式子变形
[ABC297F] Minimum Bounding Box 2_acm_19
其中[ABC297F] Minimum Bounding Box 2_Code_20都可看为常量,我们只需维护这几个前缀和就可以方便的转移了:[ABC297F] Minimum Bounding Box 2_oi_21

[ABC297F] Minimum Bounding Box 2_取模_22

#include <iostream>
using namespace std;
const int mod = 998244353;
const int maxn = 1003;
const int maxm = 1000006;
int n, m, k, ans;
int f[maxn][maxn], s[maxn][maxn], si[maxn][maxn], sj[maxn][maxn], sij[maxn][maxn];
int fac[maxm], ifac[maxm];
void add (int &x, int y){ x = ((x + y) % mod + mod) % mod; }
int C (int n, int m)
{
    if (n < m)  return 0;
    return 1ll * fac[n] * ifac[m] % mod * ifac[n - m] % mod;
}
int main ()
{
    cin >> n >> m >> k;
    fac[0] = ifac[0] = ifac[1] = 1;
    for (int i = 1; i <= 1e6; ++i)  fac[i] = 1ll * fac[i - 1] * i % mod;
    for (int i = 2; i <= 1e6; ++i)  ifac[i] = (mod - 1ll * mod / i * ifac[mod % i] % mod) % mod;
    for (int i = 1; i <= 1e6; ++i)  ifac[i] = 1ll * ifac[i - 1] * ifac[i] % mod;
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j) {
            f[i][j] = C(i * j, k);
            add(s[i][j], ((s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1]) % mod + mod) % mod);
            add(si[i][j], ((si[i - 1][j] + si[i][j - 1] - si[i - 1][j - 1]) % mod + mod) % mod);
            add(sj[i][j], ((sj[i - 1][j] + sj[i][j - 1] - sj[i - 1][j - 1]) % mod + mod) % mod);
            add(sij[i][j], ((sij[i - 1][j] + sij[i][j - 1] - sij[i - 1][j - 1]) % mod + mod) % mod);

            add(f[i][j], -1ll * (i + 1) * (j + 1) * s[i][j] % mod);
            add(f[i][j], 1ll * (i + 1) * sj[i][j] % mod);
            add(f[i][j], 1ll * (j + 1) * si[i][j] % mod);
            add(f[i][j], -sij[i][j]);

            add(s[i][j], f[i][j]);
            add(si[i][j], 1ll * i * f[i][j] % mod);
            add(sj[i][j], 1ll * j * f[i][j] % mod);
            add(sij[i][j], 1ll * i * j * f[i][j] % mod);

            add(ans, 1ll * f[i][j] * i % mod * j % mod * (n - i + 1) % mod * (m - j + 1) % mod);
        }
    cout << 1ll * ans * ifac[n * m] % mod * fac[k] % mod * fac[n * m - k] % mod << endl;
    return 0;
}

如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

上一篇: cdq分治简述与小试 下一篇: CF1834E MEX of LCM
  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  1BnnW8rtw7M9   2023年12月22日   119   0   0 算法i++i++mathMath算法
YdxfFsjpYokY