于是去弄了个板子来

#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 方阵的行列式 - 数学的更多相关文章

  1. Wannafly Winter Camp 2020 Day 7E 上升下降子序列 - 数学

    神奇公式 #include <bits/stdc++.h> using namespace std; #define int long long int n,mod,c[205][205] ...

  2. Wannafly Winter Camp 2020 Day 7A 序列 - 树状数组

    给定一个全排列,对于它的每一个子序列 \(s[1..p]\),对于每一个 \(i \in [1,p-1]\),给 \(s[i],s[i+1]\) 间的每一个值对应的桶 \(+1\),求最终每个桶的值. ...

  3. Wannafly Winter Camp 2020 Day 6J K重排列 - dp

    求 \(K\) 是多少个 \(n\) 元置换的周期.\(T\leq 100, n\leq 50, K \leq 10^{18}\) Solution 置换可以被试做若干个环组成的有向图,于是考虑 dp ...

  4. Wannafly Winter Camp 2020 Day 6I 变大! - dp

    给定一个序列,可以执行 \(k\) 次操作,每次选择连续的三个位置,将他们都变成他们的最大值,最大化 \(\sum a_i\) 需要对每一个 \(k=i\) 输出答案 \(n \leq 50, a_i ...

  5. Wannafly Winter Camp 2020 Day 6H 异或询问 - 二分

    给定一个长 \(n\) 的序列 \(a_1,\dots,a_n\),定义 \(f(x)\) 为有多少个 \(a_i \leq x\) 有 \(q\) 次询问,每次给定 \(l,r,x\),求 \(\s ...

  6. Wannafly Winter Camp 2020 Day 6G 单调栈 - 贪心

    对于排列 \(p\),它的单调栈 \(f\) 定义为,\(f_i\) 是以 \(p_i\) 结尾的最长上升子序列的长度 先给定 \(f\) 中一些位置的值,求字典序最小的 \(p\) 使得它满足这些值 ...

  7. Wannafly Winter Camp 2020 Day 6D 递增递增 - dp,组合数学

    给定两个常为 \(n\) 的序列 \(l_i,r_i\),问夹在它们之间 ( \(\forall i, l_i \leq a_i \leq r_i\) ) 的不降序列的元素总和. Solution 先 ...

  8. Wannafly Winter Camp 2020 Day 6C 酒馆战棋 - 贪心

    你方有 \(n\) 个人,攻击力和血量都是 \(1\).对方有 \(a\) 个普通人, \(b\) 个只有盾的,\(c\) 个只有嘲讽的,\(d\) 个有盾又有嘲讽的,他们的攻击力和血量都是无穷大.有 ...

  9. 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} ...

随机推荐

  1. Go语言实现:【剑指offer】正则表达式匹配

    该题目来源于牛客网<剑指offer>专题. 请实现一个函数用来匹配包括 . 和 * 的正则表达式.模式中的字符.表示任意一个字符,而 * 表示它前面的字符可以出现任意次(包含0次). 在本 ...

  2. 从Golang中open的实现方式看Golang的语言设计

    Golang有很多优点: 开发高效:(C语言写一个hash查找很麻烦,但是go很简单) 运行高效:(Python的hash查找好写,但比Python高效很多) 很少的系统库依赖:(环境依赖少,一般不依 ...

  3. Yandex Big Data Essentials Week1 Unix Command Line Interface File Content exploration

    cat displays the contents of a file at the command line copies or apppend text file into a document ...

  4. sparc v8 stack frame calling convention

    main.c ; int main() { int a, b; int sum; a = ; b = ; sum = add(a, b); ; } int add(int a, int b) { in ...

  5. 关于ELF文件和BIN文件

    ELF文件执行过程 ELF文件有操作系统的加载器loader执行,比如linux,windows,对于3803处理器是grmon的load命令. 加载器会读取ELF文件program header,比 ...

  6. Windows2008R2搭建共享存储服务器

    说明: 为了方便公司个部门软件.项目.文档等资料的归档和保存,实现公司内部资料共享及重要资料备份,防止因个人计算机系统故障或硬件故障导致数据丢失而造成数据无法恢复的损失,特建立共享服务器 1.在共享服 ...

  7. vue自带的实例属性和方法($打头)

    Vue 实例内置了一些有用的实例属性与方法.它们都有前缀 $,以便与用户定义的属性区分开来.例如: var data = { a: 1 } var vm = new Vue({ el: '#examp ...

  8. js文本复制插件&vue

    /* HTML: * <a href="javascript:;" class="copy" data-clipboard-text="copy ...

  9. Java数据结构--单链表

    #java学习经验总结------单链表的建立与结点的增删 在该链表结点有data数据,并且还有cpu,分给cpu随机的时间片,根据时间片大小进行结点data的排序 链表结点的建立 class Lin ...

  10. clr via c# 参数和属性

    1,可选参数和命名参数 当给参数指定默认值时,可以在调用的时候省略 有默认值的参数,必须放在所有没有默认值的参数后面,但是 参数数组必须放在最后面,parm 默认值必须时编译时能确定的常量值,对于值类 ...