zoukankan      html  css  js  c++  java
  • [CF1342E] Placing Rooks

    [CF1342E] Placing Rooks - 第二类斯特林数

    Description

    (n imes n) 的国际象棋棋盘上放 (n) 个车,要求满足两个条件:所有的空格子都能被至少一个车攻击到。恰好有 (k) 对车可以互相攻击到。

    Solution

    如果 (k ge n) 那么显然是不可能的

    行和列至少有一个是满的,现在我们假设行是满的,看列

    每缺一个列,就意味着有两个家伙可以共列,也就多了一对相互攻击

    现在我们令 (m=n-k),也就是实际有东西的列数

    首先我们要把这些列选出来,贡献一个二项式系数

    然后我们要对 (n) 行每行让它选一列,同时保证 (m) 列都至少出现一次

    第二类斯特林数是把 (n) 个不同的元素分为 (m) 个不可分别的集合,我们再送它一个 (m!) 就变成了可分的集合,因此答案就是

    [inom n m S_2(n,m) m! ]

    第二类斯特林数可以转化为线性多个组合数等玩意的和计算

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    
    const int mod = 998244353;
    
    int qpow(int p, int q)
    {
        return (q & 1 ? p : 1) * (q ? qpow(p * p % mod, q / 2) : 1) % mod;
    }
    
    int inv(int p)
    {
        return qpow(p, mod - 2);
    }
    
    const int N = 1e6 + 5;
    
    int fac[N];
    
    void init()
    {
        fac[0] = 1;
        for (int i = 1; i < N; i++)
            fac[i] = fac[i - 1] * i % mod;
    }
    
    int binom(int n, int m)
    {
        return fac[n] * inv(fac[m]) % mod * inv(fac[n - m]) % mod;
    }
    
    int stirling(int n, int m)
    {
        int ans = 0;
        for (int i = 0; i <= m; i++)
        {
            int k = i;
            ans += (k & 1 ? mod - 1 : 1) * binom(m, k) % mod * qpow(m - k, n) % mod;
            ans %= mod;
            ans += mod;
            ans %= mod;
        }
        ans *= inv(fac[m]);
        ans %= mod;
        return ans;
    }
    
    signed main()
    {
        ios::sync_with_stdio(false);
    
        init();
    
        int n, k;
        cin >> n >> k;
    
        if (k >= n)
            cout << 0 << endl;
        else
            cout << stirling(n, n - k) * binom(n, n - k) % mod * (k == 0 ? 1 : 2) % mod * fac[n - k] % mod << endl;
    }
    
  • 相关阅读:
    CSS3 3D转换
    CSS3 2D转换
    CSS3 字体
    CSS3 文本效果
    Spring核心技术(十三)——环境的抽象
    表达式求值
    一些设计上的原则
    POJ2503字典树
    MBR结构解析与fdisk的bash实现
    微服务指南走北(三):Restful API 设计简述
  • 原文地址:https://www.cnblogs.com/mollnn/p/14654509.html
Copyright © 2011-2022 走看看