[LOJ 3409] Yet Another Linear Algebra Problem
一、题目
二、解法
张成线性空间的维数是 \(m\) 等价于线性不相关的向量有 \(m\) 个,把向量写成 \(n\times m\) 的矩阵的秩是 \(m\)
这里普及一下比内\(-\)柯西公式,对于 \(s\times n\) 的矩阵 \(A\) 和 \(n\times s\) 的矩阵 \(B\),若 \(s\leq n\),设矩阵 \(A_s\) 是任意取出 \(A\) 的 \(s\) 列构成的 \(s\times s\) 的矩阵,\(B_s\) 是取出 \(B\) 中与 \(A_s\) 编号相对应的 \(s\) 行构成的 \(s\times s\) 的矩阵:
\[|AB|=\sum |A_s|\cdot |B_s| \]
对于子问题 \(1\),我们构造出 \(m\times n\) 的矩阵 \(A\) 为给定向量竖着排列的结果,答案是:
因为如果选出来的 \(m\) 个向量不满秩的话,算出来的行列式是 \(0\);如果满秩算出来的行列式是 \(1/2\),因为把相同的向量构成矩阵的行列式乘了上去(只不过转置了一下),所以模 \(3\) 的结果一定是 \(1\),那么对总方案有 \(1\) 的贡献。
对于子问题 \(2\),我们再构造 \(n\times m\) 的矩阵 \(C\) 表示第 \(i\) 个向量是否有颜色 \(j\),答案是:
因为首先要求选出来的 \(m\) 个向量满秩,前一个行列式就是 \(1\);再要求选出来的向量包含了所有颜色,也就是 \(C_m\) 满秩那么后一个行列式是 \(1\),当两个条件同时成立的时候产生 \(1\) 的贡献。
那么简单矩乘 \(+\) 高斯消元求行列式即可。
三、总结
主要是比内柯西公式的运用,这道题主要是选出的向量一定是 \(m\) 个,正好契合了此公式。
#include <cstdio>
#include <iostream>
using namespace std;
const int M = 505;
int read()
{
int x=0,f=1;char c;
while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;}
while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
return x*f;
}
int tp,n,m,a[M][M],b[M][M],c[M][M];
int gauss(int n,int p)
{
int ans=1;
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
if(!c[i][i] && c[j][i])
{
ans=ans*(p-1)%p;
swap(c[i],c[j]);
break;
}
ans=ans*c[i][i]%p;
for(int j=1;j<=n;j++)
{
if(i==j || !c[j][i]) continue;
int t=c[j][i]*c[i][i]%p;
for(int k=1;k<=n;k++)
c[j][k]=(c[j][k]-t*c[i][k]%p+p)%p;
}
}
return ans;
}
void work1()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
a[j][i]=b[i][j]=read();
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=m;k++)
c[i][k]=(c[i][k]+a[i][j]*b[j][k])%3;
printf("%d\n",gauss(m,3));
}
void work2()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
a[j][i]=read();
b[i][read()]=1;
}
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=m;k++)
c[i][k]=(c[i][k]+a[i][j]*b[j][k])%2;
printf("%d\n",gauss(m,2));
}
signed main()
{
tp=read();n=read();m=read();
if(tp==1) work1();
else work2();
}
原文地址:https://www.cnblogs.com/C202044zxy/p/15040393.html
- Hive表字段Comment中文乱码
- 在Win10上是用Anaconda搭建TensorFlow开发环境
- A Gentle Introduction to Autocorrelation and Partial Autocorrelation (译文)
- A Gentle Introduction to Applied Machine Learning as a Search Problem (译文)
- 技术创新,基于 React Native 的开源项目 | 码云周刊第 17 期
- How to Use the TimeDistributed Layer for Long Short-Term Memory Networks in Python 译文
- ssctf2017_WriteUp
- CENTOS7.2安装CDH5.10和Kudu1.2(一)
- Docker镜像管理
- 360春秋杯3道web题的简单分析
- Vue 2.0 学习总结,精华全在这里了
- 25.2 安装Docker
- 使用JDBC向Kudu表插入中文字符-cast的秘密
- 使用JDBC向Kudu表插入中文字符-双引号的秘密
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Kafka核心API——AdminClient API
- PyQt5 技术篇-调用颜色对话框(QColorDialog)获取颜色,调色板的调用。
- Kafka的安装与配置
- PyQt5 技术篇-如何彻底删除控件?布局移除控件方法。
- PyQt5 技术篇-设置滚动条拉动位置,scrollArea滚动条位置设置方法。
- CentOS8更换yum源后出现同步仓库缓存失败的问题
- log4j配置方式
- 基于MHA搭建MySQL Replication集群高可用架构
- PyQt5 技巧篇-解决相对路径无法加载图片问题,styleSheet通过"相对"路径加载图片,python获取当前运行文件的绝对路径。
- 基于MMM搭建MySQL Replication集群高可用架构
- Python 技术篇-按任意格式灵活获取日期、时间、年月日、时分秒。日期格式化。
- 当删库时如何避免跑路
- Python 句法错误:"SyntaxError: invalid character in identifier",原因及解决方法
- Python3 多线程问题:ModuleNotFoundError: No module named 'thread',原因及解决办法。
- 文件传输和秒传