考虑向量ai能否换成向量bj

首先ai都是线性无关的,然后可以a线性表出bj c1*a1+c2*a2+...=bj

然后移项,得 c1/ci*a1+...-1/ci*bj+...=ai

所以当ci不为0得时候是可以替换的,

所以C*A=B 若c[i][j]!=0 那么ai可以换成bj

然后求逆计算。

关于字典序最小得最大匹配。在做完最大匹配之后,从前往后找不影响前面得交错路进行修改即可。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (ll i=j;i<=k;++i)
#define D(i,j,k) for (ll i=j;i>=k;--i)
#define ll long long const ll md=999911657;
ll n; struct matrix{
ll x[305][305];
void init(){memset(x,0,sizeof x);}
matrix operator * (const matrix & a ) const{
matrix ret;
ret.init();
F(i,1,n) F(j,1,n)
{
F(k,1,n) ret.x[i][j]=ret.x[i][j]+x[i][k]*a.x[k][j];
ret.x[i][j]%=md;
}
return ret;
}
void build()
{
init();
F(i,1,n) x[i][i]=1;
}
void read()
{F(i,1,n)F(j,1,n)scanf("%lld",&x[i][j]);}
}A,B,C,Ainv; ll qpow(ll a,ll b)
{
ll ret=1;
while (b)
{
if (b&1) (ret*=a)%=md;
(a*=a)%=md;
b>>=1;
}
return ret;
} matrix gauss(matrix & x)
{
matrix E; E.build();int i,j,k;
for (i=1;i<=n;++i)
{
for (k=i;k<=n;++k) if (x.x[k][i]) break;
for (j=1;j<=n;++j) swap(x.x[i][j],x.x[k][j]),swap(E.x[i][j],E.x[k][j]);
ll inv=qpow(x.x[i][i],md-2);
for (j=1;j<=n;++j)
{
x.x[i][j]=x.x[i][j]*inv%md;
E.x[i][j]=E.x[i][j]*inv%md;
}
for (k=1;k<=n;++k)
if (k!=i)
{
ll tmp=(md-x.x[k][i]%md)%md;
for (j=1;j<=n;++j)
{
x.x[k][j]=(x.x[k][j]+x.x[i][j]*tmp)%md;
E.x[k][j]=(E.x[k][j]+E.x[i][j]*tmp)%md;
}
}
}
return E;
} int map[305][305],vis[305],linker[305]; bool dfs(int o)
{
F(i,1,n)if (map[o][i]&&!vis[i])
{
vis[i]=1;
if (!linker[i]||dfs(linker[i]))
{
linker[i]=o;
return true;
}
}
return false;
} int dfs2(int o,int from)
{
for (int i=1;i<=n;++i)
if (map[o][i]&&!vis[i])
{
vis[i]=1;
if (linker[i]==from||linker[i]>from&&dfs2(linker[i],from))
{
linker[i]=o;
return true;
}
}
return false;
} int main()
{
scanf("%lld",&n);
A.read();B.read();Ainv=gauss(A);
C=B*Ainv;
F(i,1,n) F(j,1,n) if (C.x[i][j]) map[j][i]=1;
F(i,1,n)
{
memset(vis,0,sizeof vis);
if (!dfs(i))
{
printf("NIE\n");
return 0;
}
}
F(i,1,n)
{
memset(vis,0,sizeof vis);
dfs2(i,i);
}
printf("TAK\n");
F(i,1,n)F(j,1,n)if (linker[j]==i)printf("%d\n",j);
return 0;
}

  

最新文章

  1. oracle中 SELECT INTO 和INSERT INTO ... SELECT区别
  2. oracle 将多字段数据合成一个
  3. linux中mysql如何设置为开机启动
  4. 导入Eclipse工程 到 Android Studio
  5. JVM -Xss调整Stack Space的大小 【转】
  6. asp.net mvc4使用百度ueditor编辑器
  7. 在eclipse.ini中指定jdk的方式
  8. careercup-C和C++ 13.10
  9. Yii框架CGridView columns中使用数组或变量传值
  10. 微软 Microsoft
  11. Android中通过代码获取arrays.xml文件中的数据
  12. ssh ipv6
  13. python中的线程技术
  14. react_app 项目开发_遇到的坑
  15. python中自定义的栈
  16. 一分钟了解contextlib模块
  17. Ubuntu: repository/PPA 源
  18. 深入理解Linux内核-信号
  19. 嵌入式驱动开发只设备数---dts
  20. SQL 数据库 子查询及示例

热门文章

  1. sublime前端插件以及常用快捷键
  2. [Python]输出中文报错的解决方法
  3. Hadoop集群_VSFTP安装配置
  4. 如何在ABAP里用函数式编程思想打印出非波拉契Fibonacci(数列)
  5. 通过StringBuilder的reverse()实现倒序
  6. Linux文件系统概述二
  7. bzoj5138 [Usaco2017 Dec]Push a Box
  8. node.js中常用的fs文件系统
  9. verilog behavioral modeling ---Block statements
  10. 图像分割loss集合