传送门
题意
给定一个满秩的矩阵 AAA ,另一个矩阵 BBB
对于 AAA 的每个行向量 AiA_iAi​ 找到一个匹配 BBB 的行向量 BpiB_{p_i}Bpi​​
使得 AiA_iAi​ 替换成 BpiB_{p_i}Bpi​​ 后的矩阵 A′A'A′ 仍然满秩
Sol
如果 BpiB_{p_i}Bpi​​ 能替换 AiA_iAi​,那么说明存在一个向量 λ\lambdaλ 使得 λ×A′=Bpi\lambda \times A'=B_{p_i}λ×A′=Bpi​​
而 AAA 线性无关,只要 AAA 的元素表示 BpiB_{p_i}Bpi​​ 的线性组合中 AiA_iAi​ 的系数不为 000 就好了
所以只要求出系数矩阵 CCC,使得 C×A=BC\times A=BC×A=B
然后对于不为 000 的 Ci,jC_{i,j}Ci,j​,将 jjj 向 iii 连边,求这个二分图的字典序最小的完备匹配就好了
求 CCC 可以矩阵求逆实现,C=B×A−1C=B\times A^{-1}C=B×A−1
求二分图的字典序最小的完备匹配,可以先跑一遍匈牙利算法
然后在这个基础上再跑一次增广,贪心的匹配最小的,只改变匹配比当前点大的匹配边

# include <bits/stdc++.h>
using namespace std;
typedef long long ll;const int mod(10007);int a[305][605], b[305][305], d[305][305], c[305][305];
int idx, n, ans, match[305], chos[305], cnt, vis[305];inline int Pow(int x, int y) {register int ret = 1;for (; y; y >>= 1, x = x * x % mod)if (y & 1) ret = ret * x % mod;return ret;
}inline void GetInv() {register int i, j, k, inv, m = n + n;for (i = 1; i <= n; ++i) a[i][i + n] = 1;for (i = 1; i <= n; ++i) {for (j = i; j <= n; ++j)if (a[j][i]) {if (i != j) swap(a[i], a[j]);break;}inv = Pow(a[i][i], mod - 2);for (j = i; j <= m; ++j) a[i][j] = a[i][j] * inv % mod;for (j = 1; j <= n; ++j)if (i != j)for (inv = a[j][i], k = i; k <= m; ++k) a[j][k] = (a[j][k] - a[i][k] * inv % mod + mod) % mod;}for (i = 1; i <= n; ++i)for (j = 1; j <= n; ++j) d[i][j] = a[i][j + n];
}inline void GetEdge() {register int i, j, k;for (i = 1; i <= n; ++i)for (j = 1; j <= n; ++j)for (k = 1; k <= n; ++k)(c[i][k] += b[i][j] * d[j][k] % mod) %= mod;
}int Dfs(int u) {register int v;for (v = 1; v <= n; ++v)if (c[v][u] && vis[v] != idx) {vis[v] = idx;if (!match[v] || Dfs(match[v])) return chos[u] = v, match[v] = u, 1;}return 0;
}int Change(int u, int rt) {register int v;for (v = 1; v <= n; ++v)if (c[v][u] && vis[v] != idx) {vis[v] = idx;if (!match[v] || (match[v] > rt && Change(match[v], rt))) return chos[u] = v, match[v] = u, 1;}return 0;
}int main() {scanf("%d", &n);register int i, j;for (i = 1; i <= n; ++i)for (j = 1; j <= n; ++j) scanf("%d", &a[i][j]);for (i = 1; i <= n; ++i)for (j = 1; j <= n; ++j) scanf("%d", &b[i][j]);GetInv(), GetEdge();for (i = 1; i <= n; ++i) ++idx, ans += Dfs(i);if (ans != n) return puts("NIE"), 0;puts("TAK");for (i = 1; i <= n; ++i) ++idx, match[chos[i]] = 0, chos[i] = 0, Change(i, i);for (i = 1; i <= n; ++i) printf("%d\n", chos[i]);return 0;
}

BZOJ3168: [Heoi2013]钙铁锌硒维生素相关推荐

  1. Bzoj3168 [Heoi2013]钙铁锌硒维生素

    Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 466  Solved: 151 Description 银河队选手名单出来了!小林,作为特聘的营养师 ...

  2. BZOJ3168. [HEOI2013]钙铁锌硒维生素(线性代数+二分图匹配)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3168 题解 首先,我们需要求出对于任意的 \(i, j(1 \leq i, j \leq ...

  3. bzoj3168 [Heoi2013]钙铁锌硒维生素(矩阵求逆+匈牙利)

    如果把ai替换成bj,这n个向量还是线性无关即可以. 我们求一个C∗A=B,=>C=B∗A−1C∗A=B,=>C=B∗A−1C*A=B,=>C=B*A^{-1} 矩阵求逆可以高斯消元 ...

  4. 【BZOJ3168】[Heoi2013]钙铁锌硒维生素 高斯消元求矩阵的逆+匈牙利算法

    [BZOJ3168][Heoi2013]钙铁锌硒维生素 Description 银河队选手名单出来了!小林,作为特聘的营养师,将负责银河队选手参加宇宙比赛的饮食.众所周知,前往宇宙的某个星球,通常要花 ...

  5. 洛谷 P4100 [HEOI2013]钙铁锌硒维生素 解题报告

    P4100 [HEOI2013]钙铁锌硒维生素 题目描述 银河队选手名单出来了!小林,作为特聘的营养师,将负责银河队选手参加 宇宙比赛的饮食. 众所周知,前往宇宙的某个星球,通常要花费好长好长的时间, ...

  6. BZOJ 3168: [Heoi2013]钙铁锌硒维生素 [线性基 Hungary 矩阵求逆]

    3168: [Heoi2013]钙铁锌硒维生素 题意:给一个线性无关组A,再给一个B,要为A中每个向量在B中选一个可以代替的向量,替换后仍然线性无关.判断可行和求字典序最小的解 PoPoQQQ orz ...

  7. BZOJ 3168 Luogu P4100 [HEOI2013]钙铁锌硒维生素 (矩阵求逆、二分图匹配)

    线性代数+图论好题. 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3168 (luogu) https://www.lu ...

  8. [HEOI2013] 钙铁锌硒维生素

    Description 给定2N2N个行向量A1,-,AN,B1,-,BNA_1,\dots,A_N,B_1,\dots,B_N,需要设计一种替换方案,AiA_i被BjB_j替换(i∈[1,N],j∈ ...

  9. 【BZOJ】3168: [Heoi2013]钙铁锌硒维生素

    题解 Ca Fe Zn Se 显然我们既然初始矩阵就能通过线性变换变成单位矩阵,则该矩阵一定有逆 没有逆输出NIE 而且因为这些向量两两正交,则表示一个向量的时候表示方法唯一 那么我们求一个逆可以求出 ...

最新文章

  1. 学术论文模式图、统计图绘制
  2. java如何计算html高度,如何检索HTML元素的实际宽度和高度?
  3. NOI.AC-保镖【贪心,对顶堆】
  4. SpringMvc+Tomcat+Angular4 部署运行
  5. 封装jxl导出不同数据类型的excel
  6. pdo调用mysql存储过程_获取out参数值问题_调用Oracle存储过程并获取out参数值-阿里云开发者社区...
  7. 2020软考高级系统分析师,你想知道的全在这
  8. centos7阿里yum源报问题
  9. 思科(Cisco)交换机路由器命令大全
  10. 淘宝评论API接口,item_review-获得淘宝商品评论API接口接入说明
  11. 远程桌面控制计算机,如何远程控制电脑?远程控制别人计算机(2种实用方法)...
  12. 【预测模型】基于RLS算法求解数据预测matlab代码
  13. 滴滴云服务器搭建网站的一键脚本,一键搭建流控脚本 一键搭建云免流服务器...
  14. 渗透测试国内外研究_【技术探究】冰箱门封技术现状与研究进展
  15. win11 跳过检测直接升级
  16. mybatis-plus视图查询
  17. Python中的 if __name__ == __main__到底是个啥意思?
  18. excel表制作进销存表
  19. U8入库单后台查询处理 常用 SQL 语句(持续更新)
  20. 注解都不会用,怎让Java对你动情

热门文章

  1. 达人评测 r7 7730U和R5 7530U选哪个好 锐龙r77730U和R57530U对比
  2. 怎么确定自己毕业论文方向?
  3. Runtime源码剖析-对象
  4. 对于makefile不支持c++11的处理
  5. 串口调试精灵的使用和串口程序调试技巧
  6. 伪随机二进制序列(PRBS)
  7. 计算机毕业设计springboot基于疫情背景下的新型点餐送餐系统bpe1s源码+系统+程序+lw文档+部署
  8. 苹果cms怎么采集别人网站的视频
  9. 程序开发语言之兵器谱排名
  10. JavaSE-饿了么项目实战