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;
    }
    
  • 相关阅读:
    Spring JPA使用CriteriaBuilder动态构造查询
    vscode 将本地项目上传到github、从github克隆项目以及删除github上的某个文件夹
    CDN 加速配置
    dos常用命令
    使用Github作为博客的图床
    一个简单mock-server 解决方案
    postman(三):详解postman动态变量使用
    postman(一):详解在postman中使用环境变量
    postman(二):详解在Pre-request Script中如何执行请求
    MySql中4种批量更新的方法
  • 原文地址:https://www.cnblogs.com/mollnn/p/14654509.html
Copyright © 2011-2022 走看看