Matrix
题意:一个 n×nn\times nn×n 的矩阵,每个位置放置一个数,数的范围 ∈[1,n2]\in [1,n^2]∈[1,n2],从第 111 行到第 nnn 行,每行的最小值形成一个集合 A=A=A= {a1,a2,a3...ana_1,a_2,a_3...a_na1​,a2​,a3​...an​},与集合 B=B=B= {1,2,3,....n1,2,3,....n1,2,3,....n} 的交集生成集合 SSS, ∣S∣|S|∣S∣ 表示集合 SSS 所有数之和,求所有的 SSS 集合的 ∣S∣|S|∣S∣ 之和。
思路:
每一个矩阵可以生成一个集合 A=A=A= {a1,a2,a3...ana_1,a_2,a_3...a_na1​,a2​,a3​...an​},与集合 BBB 取交集进而生成一个集合 SSS。
我们考虑计算贡献
先看 111,无论它在矩阵的哪个位置始终会生成到集合 AAA,然后看 222,它只有与 111 在同一行的时候才无法产生贡献,看 333,只有1,21,21,2 的位置会对 333 产生贡献有影响,然后我们可以发现,对于 i∈(1,2,3,...n)i \in (1,2,3,...n)i∈(1,2,3,...n),只有 <i<i<i 的 i−1i-1i−1个数的位置会对 iii 产生的贡献有影响。
一开始我考虑用所有的情况 −-− 无法产生贡献的情况去计算答案(n=2n=2n=2的时候过样例了以为写对了,结果一直wa,写的代码比较烂,有时候还T),然后发现情况比较复杂,如果考虑直接计算产生贡献的情况其实是不复杂的。
我们先选定 iii ,然后给在 n2−in^2-in2−i 个 数中选 n−1n-1n−1 个数来和它在一排(Cn2−in−1C_{n^2-i}^{n-1}Cn2−in−1​),然后乘以这一行的全排列 AnnA_n^nAnn​,然后乘以 Cn1C_n^1Cn1​,确定这行在哪,然后再安排剩下的 n2−nn^2-nn2−n 个数。
首先选出 nnn 个数,Cn2−nnC_{n^2-n} ^ nCn2−nn​ 在一行,然后全排列
然后继续选 nnn 个数, Cn2−2nnC_{n^2-2n} ^nCn2−2nn​ 在一行,然后全排列

然后我们把它写成分数的形式就可以发现可以化简
n!(n2−n)!n!(n2−2n)!×n! \frac{(n^2-n)!}{n!(n^2-2n)!} \timesn!n!(n2−2n)!(n2−n)!​× n!(n2−2n)!n!(n2−3n)!×n! \frac{(n^2-2n)!}{n!(n^2-3n)!} \timesn!n!(n2−3n)!(n2−2n)!​× n!(n2−3n)!n!(n2−4n)!×n! \frac{(n^2-3n)!}{n!(n^2-4n)!} \timesn!n!(n2−4n)!(n2−3n)!​× … n!2n!n!n!×n! \frac{2n!}{n!n!} \timesn!n!n!2n!​× n!n!n!0!n! \frac{n!}{n!0!}n!n!0!n!​
然后我们可以发现,每一项分子分母都有 n!n!n!,就都约掉了,分母的一部分可以和后一项分子约掉,最后剩下 (n2−n)!{(n^2-n)!}(n2−n)!

举个例子简化这个过程:比如有 1,2,3,4,51,2,3,4,51,2,3,4,5 这 555 个数,求全排列,其中 333 是特殊的,我们先安排3的位置,有 555个位置可以选择,然后考虑其他的数C41C_4^1C41​,再选一个 C31C_3^1C31​,继续 C21C_2^1C21​,C11C_1^1C11​,最后得到 A55A_5^5A55​。
所以我们得到公式
∑i=1i=nCn2−in−1AnnCn1(n2−n)!\sum_{i=1}^{i=n}C_{n^2-i}^{n-1}A_n^nC_n^1(n^2-n)! i=1∑i=n​Cn2−in−1​Ann​Cn1​(n2−n)!
(其实好像也可以这么理解,安排第一行和它的位置之后,剩下的数进行全排列。

我们预处理一下所有的阶乘,注意计算组合数的时候就没必要用 forforfor 来计算,直接用阶乘+逆元求得,不然也会 TLETLETLE。
复杂度:O(nlog(n))O(nlog(n))O(nlog(n))
code:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 5e3 + 9;
const int maxm = 2e7 + 5e6 + 9;
const int mod = 998244353;
ll A[maxm];
ll n;
ll q_pow(ll a, ll b){ll ans = 1;while(b){if(b & 1) ans=(ans*a)%mod;a=(a*a)%mod;b>>=1;}return ans;
}
ll zh(ll n, ll m)
{ll ans1 = A[n] * q_pow(A[n-m],mod-2) % mod;return ans1 * q_pow(A[m], mod-2ll) % mod;
}
void work()
{scanf("%lld", &n);ll ans = 0;ll tmp = n * n;ll tt = A[tmp-n] * n % mod;// 观察可以发现这项可以提出来最后算for(ll i = 1; i <= n; ++i) {ll x = zh(tmp-i, n-1) * A[n] % mod;ans = (ans + x % mod) % mod;}printf("%lld\n", ans*tt%mod);
}int main()
{A[0] = 1;for(ll i = 1; i <= maxm - 9; ++i) A[i] = A[i-1] * i % mod;int TT;scanf("%d",&TT);while(TT--)work();return 0;
}

hdu-7113 Matrix 组合数学(计算贡献相关推荐

  1. R语言构建混淆矩阵(仿真数据)并基于混淆矩阵(confusion matrix)计算并计算Accuracy、Precision、Recall(sensitivity)、F1、Specificity指标

    R语言构建混淆矩阵(仿真数据)并基于混淆矩阵(confusion matrix)计算并计算Accuracy.Precision.Recall(sensitivity).F1.Specificity指标 ...

  2. P2664 树上游戏(点分治/计数题计算贡献/树上差分)

    P2664 树上游戏 对于树上n个点,每个点有不同颜色,求解每个点到其他点的路径上不同颜色个数之和. 首先看到这种树上点对问题,我们可以想到点分治,然后考虑每次分治如何求解答案,本质上就是一个数颜色的 ...

  3. 省赛训练3 G HDU 1759 Matrix Revolution(BFS)

    Matrix Revolution Time Limit: 3000 ms /Memory Limit: 32768 kb Description Lele 现在不仅会整数A+B,A*B,还会矩阵A+ ...

  4. HDU 2206 IP的计算(字符串处理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2206 Problem Description 在网络课程上,我学到了非常多有关IP的知识. IP全称叫 ...

  5. HDU 2830 Matrix Swapping II

    暴力枚举+DP预处理. 可以枚举矩形底边是哪一行,枚举到一行的时候,计算以该行为底边,最大矩形面积是多少. #include<cstdio> #include<cstring> ...

  6. HDU OJ Matrix Swapping II

    Matrix Swapping II Time Limit : 9000/3000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) ...

  7. HDU 4920 Matrix multiplication(矩阵相乘)

    各种TEL,233啊.没想到是处理掉0的情况就能够过啊.一直以为会有极端数据.没想到居然是这种啊..在网上看到了一个AC的奇妙的代码,经典的矩阵乘法,仅仅只是把最内层的枚举,移到外面就过了啊...有点 ...

  8. 【ZOJ - 3872】Beauty of Array(思维,计算贡献,枚举)

    题干: Edward has an array A with N integers. He defines the beauty of an array as the summation of all ...

  9. hdu 1394 线段树计算逆序数

    线段树计算逆序数的原理: 用线段树来统计已插入的数的个数(所以要保证最大的那个数不能太大,否则数组都开不了),然后每插入一个数,就查询比插入的数大的个数,累加即可. 这个题还有一个特点就是,题目给的是 ...

最新文章

  1. OpenCV,马赛克 常用图像增强算法的实现
  2. 得到qq正在登录的qq号
  3. 直方图尖峰python_Python系统学习 - 绘制直方图
  4. 「分块」数列分块入门1 – 9
  5. Dev C++ 实现Hello World
  6. vuejs项目开发环境搭建(ESlint安装)
  7. Vue+Vue-router+Vuex项目实战
  8. java 修改txt_Java实现批量修改txt文件名称的方法示例
  9. 数据库应用程序为什么不能脱离数据库管理系统独立运行
  10. plugin.super mysql_使用MySQ Clone Plugin部署MySQL Group Replication
  11. 程序员如何接私活?十年码农悄悄告诉你
  12. Scala编译后的class文件反编译的结果
  13. HT6221发送红外HS0038解码程序
  14. 2022-2028全球石油管材接头行业调研及趋势分析报告
  15. codeforces 1328 B. K-th Beautiful String
  16. Android工具类篇 清理APP应用缓存
  17. codeforces1359C Mixing Water
  18. 华为防火墙配置SSL+自签CA证书挑战登录
  19. Spring Boot 定制横幅banner与关闭banner
  20. clac计算样式不生效?

热门文章

  1. DDR3 HYPERLYNX SI仿真
  2. 对不起,精英主义与特斯拉精神背道而驰
  3. 金融断直连,正式开始落地!
  4. 你还不了解的OKRs-E是什么?
  5. 19【numpy中的nan和常用方法】01numpy中的nan和常用统计方法
  6. 计算机学业水平测试表格题,2010 年信息技术学业水平考试试题
  7. Apple 软件产品使用的 TCP 和 UDP 端口
  8. java中 continue outer, break inner 简解
  9. VMware创建共享文件夹并实现文件传输(Windows主机,Ubuntu虚拟机)
  10. 巴黎出差及场测攻略V1.3