• MS 与矩阵填数(算贡献)


    题意

    思路

    这种问题一般都是划分为若干不相交的集合,分别计算,然后再求和。在本题,就是算\(1\sim n\)每个数作为行最小数的方案数。

    不失一般性,我们考察\(i\)作为行最小数的方案数。由于\(i\)可以出现在任意一行,因此方案数为\(n\)。如果\(i\)为行最小数,那么同行的其他\(n - 1\)个数字必须比\(i\)要大,因此方案数就是从\(n^2 - i\)个数中选取\(n - 1\)个数,因此就是\(\tbinom{n^2-i}{n-1}\)。这一行中的\(n\)个数字可以任意排列,因此方案数为\(n!\)。在这一行之外的其他\(n^2 - n\)个数字也可以任意排列,因此方案数为\((n^2-n)!\)。综上所述,\(i\)的贡献为\(i \cdot n \cdot \tbinom{n^2-i}{n-1} \cdot n! \cdot (n^2-n)!\)

    因此最终答案为 \(\sum\limits_{i=1}^n i \cdot n \cdot \tbinom{n^2-i}{n-1} \cdot n! \cdot (n^2-n)!\)

    代码

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    
    using namespace std;
    
    typedef long long ll;
    
    const int N = 25000010;
    const int mod = 998244353;
    
    int main()
    {
        ll n;
        scanf("%lld", &n);
        ll t = 1;
        for(int i = 1; i <= n * n - n; i ++) t = t * i % mod;
        t = t * n % mod * n % mod;
        ll ans = 0;
        for(int i = 1; i <= n; i ++) {
            ll x = 1;
            for(int j = n * n - i - n + 2; j <= n * n - i; j ++) {
                x = x * j % mod;
            }
            x = x * i % mod;
            ans = (ans + x * t % mod) % mod;
        }
        printf("%lld\n", ans);
        return 0;
    }
    
  • 相关阅读:
    CMD与bat操作
    XmlHelper XML通用类
    Regex正则表达式扩展
    LONG数据类型转换为VARCHAR2并相互转换
    CLOB数据类型截取SUBSTR_按开始位置偏移量
    12c rac On redhat 7
    DML_DDL_触发器
    Linux平台 Oracle 18c RAC安装
    hadoop 透明加密
    Poco::Crypto--加解密_RSA
  • 原文地址:https://www.cnblogs.com/miraclepbc/p/16010282.html
Copyright © 2020-2023  润新知