Wannafly Winter Camp 2020 Day 7D 方阵的行列式 - 数学
于是去弄了个板子来
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 998244353;
const int N = 505;
int qpow(int p,int q) {return ((q&1)?p:1) * (q?qpow(p*p%mod,q>>1):1) % mod;}
int n, Q;
// Input: a[][],n
// Method: build() modify(i,j,x)
// Output: inv[][], ans
struct matrix {
int a[N][N], st[N][N], inv[N][N], ans, n;
void build() {
ans=1;
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
st[i][j]=a[i][j];
}
}
for (int i = 1; i <= n; i++) inv[i][i] = 1;
for (int i = 1; i <= n; i++) {
for (int j = i; j <= n; j++) {
if (a[j][i]) {
for (int k = 1; k <= n; k++) {
swap(a[i][k], a[j][k]);
swap(inv[i][k], inv[j][k]);
}
if (j > i) ans = (mod - ans) % mod;
break;
}
}
int K = qpow(a[i][i], mod-2);
for (int j = i+1; j <= n; j++) {
int tmp = K * a[j][i] % mod;
for (int k = 1; k <= n; k++) {
a[j][k] = (a[j][k] + mod - tmp * a[i][k] % mod) % mod;
inv[j][k] = (inv[j][k] + mod - tmp * inv[i][k] % mod) % mod;
}
}
}
for (int i = n; i >= 1; i--) {
int K = qpow(a[i][i], mod-2);
ans = ans * a[i][i] % mod;
for (int j = 1; j <= n; j++) {
a[i][j] = a[i][j] * K % mod;
inv[i][j] = inv[i][j] * K % mod;
}
for (int j = 1; j < i; j++) {
int tmp = a[j][i];
for (int k = 1; k <= n; k++) {
a[j][k] = (a[j][k] + mod - tmp * a[i][k] % mod) % mod;
inv[j][k] = (inv[j][k] + mod - tmp * inv[i][k] % mod) % mod;
}
}
}
}
void modify(int x,int y,int z) {
int t = (z + mod - st[x][y]) % mod;
st[x][y] = z;
for (int i = 1; i <= n; i++) {
a[i][y] = (a[i][y] + t * inv[i][x] % mod) % mod;
}
{
int i = y;
int K = qpow(a[i][i], mod-2);
ans = ans * a[i][i] % mod;
for (int j = 1; j <= n; j++) {
a[i][j] = a[i][j] * K % mod;
inv[i][j] = inv[i][j] * K % mod;
}
for (int j = 1; j <= n; j++) {
if (j == i) continue;
int tmp = a[j][i];
for (int k = 1; k <= n; k++) {
a[j][k] = (a[j][k] + mod - tmp * a[i][k] % mod) % mod;
inv[j][k] = (inv[j][k] + mod - tmp * inv[i][k] % mod) % mod;
}
}
}
}
} mat;
signed main() {
scanf("%d%d", &n, &Q);
mat.n = n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
scanf("%d", &mat.a[i][j]);
}
}
mat.build();
while(Q--) {
int t1,t2,t3;
scanf("%d%d%d", &t1, &t2, &t3);
mat.modify(t1,t2,t3);
printf("%d\n", mat.ans);
}
}
/*
2 3
0 1
1 0
1 1 1
2 1 2
2 2 1
[Output]
998244352
998244351
998244352
*/
Wannafly Winter Camp 2020 Day 7D 方阵的行列式 - 数学的更多相关文章
- Wannafly Winter Camp 2020 Day 7E 上升下降子序列 - 数学
神奇公式 #include <bits/stdc++.h> using namespace std; #define int long long int n,mod,c[205][205] ...
- Wannafly Winter Camp 2020 Day 7A 序列 - 树状数组
给定一个全排列,对于它的每一个子序列 \(s[1..p]\),对于每一个 \(i \in [1,p-1]\),给 \(s[i],s[i+1]\) 间的每一个值对应的桶 \(+1\),求最终每个桶的值. ...
- Wannafly Winter Camp 2020 Day 6J K重排列 - dp
求 \(K\) 是多少个 \(n\) 元置换的周期.\(T\leq 100, n\leq 50, K \leq 10^{18}\) Solution 置换可以被试做若干个环组成的有向图,于是考虑 dp ...
- Wannafly Winter Camp 2020 Day 6I 变大! - dp
给定一个序列,可以执行 \(k\) 次操作,每次选择连续的三个位置,将他们都变成他们的最大值,最大化 \(\sum a_i\) 需要对每一个 \(k=i\) 输出答案 \(n \leq 50, a_i ...
- Wannafly Winter Camp 2020 Day 6H 异或询问 - 二分
给定一个长 \(n\) 的序列 \(a_1,\dots,a_n\),定义 \(f(x)\) 为有多少个 \(a_i \leq x\) 有 \(q\) 次询问,每次给定 \(l,r,x\),求 \(\s ...
- Wannafly Winter Camp 2020 Day 6G 单调栈 - 贪心
对于排列 \(p\),它的单调栈 \(f\) 定义为,\(f_i\) 是以 \(p_i\) 结尾的最长上升子序列的长度 先给定 \(f\) 中一些位置的值,求字典序最小的 \(p\) 使得它满足这些值 ...
- Wannafly Winter Camp 2020 Day 6D 递增递增 - dp,组合数学
给定两个常为 \(n\) 的序列 \(l_i,r_i\),问夹在它们之间 ( \(\forall i, l_i \leq a_i \leq r_i\) ) 的不降序列的元素总和. Solution 先 ...
- Wannafly Winter Camp 2020 Day 6C 酒馆战棋 - 贪心
你方有 \(n\) 个人,攻击力和血量都是 \(1\).对方有 \(a\) 个普通人, \(b\) 个只有盾的,\(c\) 个只有嘲讽的,\(d\) 个有盾又有嘲讽的,他们的攻击力和血量都是无穷大.有 ...
- Wannafly Winter Camp 2020 Day 6A Convolution - NTT
求 \(\sum_{i=1}^n \sum_{j=1}^n 2^{a_ia_j}\) Solution 化简一下 \[ 2^{a_ia_j} = p^{(a_i+a_j)^2-a_i^2-a_j^2} ...
随机推荐
- QT透明显示文字
实现效果: 代码: #ifndef IMAGINIST_H #define IMAGINIST_H #include <QtWidgets/QWidget> #include <Qt ...
- Pycharm学习记录---注释
在方法下面添加三个双引号然后回车即可添加参数注释
- node.js+express+mongoose实现用户增删查改案例
node.js+express+mongodb对用户进行增删查改 一.用到的相关技术 使用 Node.js 的 express 框架搭建web服务 使用 express 中间件 body-parse ...
- centos 7安装reids
一.reids下载 下载地址: https://redis.io/ 二.解压安装 ① 解压:tar -zxvf redis-5.0.5.tar.gz ② 安装环境:yum install gcc-c ...
- vue学习(二)模板页配置(bootstrap)
1.替换我们的显示页面 删除components下的所有文件,新建模板页文件夹 layout. //Layout.vue <template> <div> <header ...
- Spring Bean几种注入方式——setter(常用),构造器,注入内部Bean,注入集合,接口...
依赖注入分为三种方式: 1.1构造器注入 构造器通过构造方法实现,构造方法有无参数都可以.在大部分情况下我们都是通过类的构造器来创建对象,Spring也可以采用反射机制通过构造器完成注入,这就是构造器 ...
- 使用 pyenv 管理不同的 Python 版本
1. pyenv 的安装 $ yum install git -y $ yum install gcc make patch gdbm-devel openssl-devel sqlite-devel ...
- SELinux 和 iptables 开启关闭
SELinux 是 2.6 版本的 Linux 内核中提供的强制访问控制(MAC)系统.对于目前可用的 Linux安全模块来说,SELinux 是功能最全面,而且测试最充分的,它是在 20 年的 MA ...
- 【转载】python_logging模块
原文:https://www.cnblogs.com/liujiacai/p/7804848.html 1 logging模块简介 logging模块是Python内置的标准模块,主要用于输出运行日志 ...
- React中ref的使用
直接获取DOM元素时使用的,一般情况下尽量不要使用ref