ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-04-13 18:05:59  阅读:221  来源: 互联网

标签:第二类 Rooks return int Placing 斯特林 CF1342E fac mod


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

Description

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

Solution

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

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

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

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

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

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

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

\[\binom 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;
}

标签:第二类,Rooks,return,int,Placing,斯特林,CF1342E,fac,mod
来源: https://www.cnblogs.com/mollnn/p/14654509.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有