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} ...
随机推荐
- JSP&Servlet学习笔记----第6章
JSP与Servlet是一体两面的关系. JSP最终还是被编译为Servlet. <%@page contentType="text/html;charset=UTF-8" ...
- python3调用哈工大ltp
运行环境ubuntu+python3 安装pyltp sudo pip3 install pyltp 下载ltp_data_v3.4.0模型 http://ltp.ai/ 分句 from pyltp ...
- Codeforces_841
A.统计每个字母数量,比较是否超过k. #include<bits/stdc++.h> using namespace std; ] = {}; string s; int main() ...
- HDU_2084_DP
http://acm.hdu.edu.cn/showproblem.php?pid=2084 简单dp,从下到上,从左到右,依次更新每个位置最大值. #include<iostream> ...
- BZOJ1257 [CQOI2007]余数之和 (数论分块)
题意: 给定n, k,求$\displaystyle \sum_{i=1}^nk\;mod\;i$ n,k<=1e9 思路: 先转化为$\displaystyle \sum_{i=1}^n(k- ...
- C# WinForm 使用SMTP协议发送QQ邮箱验证码
文章来自:https://blog.csdn.net/IT_xiao_guang_guang/article/details/104336604 前言 在程序设计中,发送验证码是常见的一个功能,用 ...
- 全局new和宏结合起来的一个小应用
#include <iostream> using namespace std; void* operator new(size_t size, const char* file, int ...
- 使用递归函数用来输出n个元素的所有子集(数据结构、算法与应用)
例如,三个元素的集合A = {a,b,c}的所有子集是:空集a,b,c,ab,ac,bc,abc,共八个 分析: 对于集合A中的每个元素,在其子集中都可能存在或者不存在,所以A的子集有23种. 可以设 ...
- 《Head first设计模式》之观察者模式
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. 客户有一个WeatherData对象,负责追踪温度.湿度和气压等数据.现在客户给我们提了个 ...
- Vue-20190623点滴
Vue-20190623点滴 推荐黄奕同学vue的学习方式和过程. https://juejin.im/post/5b18d2d7f265da6e410e0e20 ♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣ ...