于是去弄了个板子来

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. const int mod = 998244353;
  5. const int N = 505;
  6. int qpow(int p,int q) {return ((q&1)?p:1) * (q?qpow(p*p%mod,q>>1):1) % mod;}
  7. int n, Q;
  8. // Input: a[][],n
  9. // Method: build() modify(i,j,x)
  10. // Output: inv[][], ans
  11. struct matrix {
  12. int a[N][N], st[N][N], inv[N][N], ans, n;
  13. void build() {
  14. ans=1;
  15. for(int i=1;i<=n;i++) {
  16. for(int j=1;j<=n;j++) {
  17. st[i][j]=a[i][j];
  18. }
  19. }
  20. for (int i = 1; i <= n; i++) inv[i][i] = 1;
  21. for (int i = 1; i <= n; i++) {
  22. for (int j = i; j <= n; j++) {
  23. if (a[j][i]) {
  24. for (int k = 1; k <= n; k++) {
  25. swap(a[i][k], a[j][k]);
  26. swap(inv[i][k], inv[j][k]);
  27. }
  28. if (j > i) ans = (mod - ans) % mod;
  29. break;
  30. }
  31. }
  32. int K = qpow(a[i][i], mod-2);
  33. for (int j = i+1; j <= n; j++) {
  34. int tmp = K * a[j][i] % mod;
  35. for (int k = 1; k <= n; k++) {
  36. a[j][k] = (a[j][k] + mod - tmp * a[i][k] % mod) % mod;
  37. inv[j][k] = (inv[j][k] + mod - tmp * inv[i][k] % mod) % mod;
  38. }
  39. }
  40. }
  41. for (int i = n; i >= 1; i--) {
  42. int K = qpow(a[i][i], mod-2);
  43. ans = ans * a[i][i] % mod;
  44. for (int j = 1; j <= n; j++) {
  45. a[i][j] = a[i][j] * K % mod;
  46. inv[i][j] = inv[i][j] * K % mod;
  47. }
  48. for (int j = 1; j < i; j++) {
  49. int tmp = a[j][i];
  50. for (int k = 1; k <= n; k++) {
  51. a[j][k] = (a[j][k] + mod - tmp * a[i][k] % mod) % mod;
  52. inv[j][k] = (inv[j][k] + mod - tmp * inv[i][k] % mod) % mod;
  53. }
  54. }
  55. }
  56. }
  57. void modify(int x,int y,int z) {
  58. int t = (z + mod - st[x][y]) % mod;
  59. st[x][y] = z;
  60. for (int i = 1; i <= n; i++) {
  61. a[i][y] = (a[i][y] + t * inv[i][x] % mod) % mod;
  62. }
  63. {
  64. int i = y;
  65. int K = qpow(a[i][i], mod-2);
  66. ans = ans * a[i][i] % mod;
  67. for (int j = 1; j <= n; j++) {
  68. a[i][j] = a[i][j] * K % mod;
  69. inv[i][j] = inv[i][j] * K % mod;
  70. }
  71. for (int j = 1; j <= n; j++) {
  72. if (j == i) continue;
  73. int tmp = a[j][i];
  74. for (int k = 1; k <= n; k++) {
  75. a[j][k] = (a[j][k] + mod - tmp * a[i][k] % mod) % mod;
  76. inv[j][k] = (inv[j][k] + mod - tmp * inv[i][k] % mod) % mod;
  77. }
  78. }
  79. }
  80. }
  81. } mat;
  82. signed main() {
  83. scanf("%d%d", &n, &Q);
  84. mat.n = n;
  85. for (int i = 1; i <= n; i++) {
  86. for (int j = 1; j <= n; j++) {
  87. scanf("%d", &mat.a[i][j]);
  88. }
  89. }
  90. mat.build();
  91. while(Q--) {
  92. int t1,t2,t3;
  93. scanf("%d%d%d", &t1, &t2, &t3);
  94. mat.modify(t1,t2,t3);
  95. printf("%d\n", mat.ans);
  96. }
  97. }
  98. /*
  99. 2 3
  100. 0 1
  101. 1 0
  102. 1 1 1
  103. 2 1 2
  104. 2 2 1
  105. [Output]
  106. 998244352
  107. 998244351
  108. 998244352
  109. */

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. JSP&Servlet学习笔记----第6章

    JSP与Servlet是一体两面的关系. JSP最终还是被编译为Servlet. <%@page contentType="text/html;charset=UTF-8" ...

  2. python3调用哈工大ltp

    运行环境ubuntu+python3 安装pyltp sudo pip3 install pyltp 下载ltp_data_v3.4.0模型 http://ltp.ai/ 分句 from pyltp ...

  3. Codeforces_841

    A.统计每个字母数量,比较是否超过k. #include<bits/stdc++.h> using namespace std; ] = {}; string s; int main() ...

  4. HDU_2084_DP

    http://acm.hdu.edu.cn/showproblem.php?pid=2084 简单dp,从下到上,从左到右,依次更新每个位置最大值. #include<iostream> ...

  5. BZOJ1257 [CQOI2007]余数之和 (数论分块)

    题意: 给定n, k,求$\displaystyle \sum_{i=1}^nk\;mod\;i$ n,k<=1e9 思路: 先转化为$\displaystyle \sum_{i=1}^n(k- ...

  6. C# WinForm 使用SMTP协议发送QQ邮箱验证码

    文章来自:https://blog.csdn.net/IT_xiao_guang_guang/article/details/104336604 前言   在程序设计中,发送验证码是常见的一个功能,用 ...

  7. 全局new和宏结合起来的一个小应用

    #include <iostream> using namespace std; void* operator new(size_t size, const char* file, int ...

  8. 使用递归函数用来输出n个元素的所有子集(数据结构、算法与应用)

    例如,三个元素的集合A = {a,b,c}的所有子集是:空集a,b,c,ab,ac,bc,abc,共八个 分析: 对于集合A中的每个元素,在其子集中都可能存在或者不存在,所以A的子集有23种. 可以设 ...

  9. 《Head first设计模式》之观察者模式

    观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. 客户有一个WeatherData对象,负责追踪温度.湿度和气压等数据.现在客户给我们提了个 ...

  10. Vue-20190623点滴

    Vue-20190623点滴 推荐黄奕同学vue的学习方式和过程. https://juejin.im/post/5b18d2d7f265da6e410e0e20 ♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣ ...