题目传送门

  快速的传送门I

  快速的传送门II

题目大意

  (题意比较复杂,请自行阅读原题)

  可以将原题的字母都看成它们的在字符表中的下标,这样问题就变成给定$n$个$m$维向量$\vec{a_{1}},\vec{a_{2}},\cdots,\vec{a_{n}}$。以及结果向量$\vec{y}$,求有多少组系数$x_{1}, x_{2}, \cdots, x_{n}$满足:

$x_{1}\vec{a_{1}}+x_{2}\vec{a_{2}}+\cdots+x_{n}\vec{a_{n}} = \vec{y}$

  这个可以用高斯消元来做。

  当存在系数矩阵的零行对应的结果向量的那一位非0,方程组无解。

  否则解的个数为$5^{n - r(A)}$。

  但是每个询问都去高斯消元会超时。

  但每次高斯消元的过程只与系数矩阵有关。因此可以记下高斯消元过程中的线性变换。询问时直接作用于结果向量。

  由于我比较懒,所以直接读入所有询问,然后刚开始就处理掉了。

  表示很久没打高斯消元,求矩阵的秩写错无数次。

Code

  1. /**
  2. * Codeforces
  3. * Problem#832E
  4. * Accepted
  5. * Time: 826ms
  6. * Memory: 3600k
  7. */
  8. #include <bits/stdc++.h>
  9. using namespace std;
  10. typedef bool boolean;
  11.  
  12. const int M = 1e9 + , max_col = ;
  13.  
  14. int qpow(int a, int pos, int p) {
  15. int pa = a, rt = ;
  16. for ( ; pos; pos >>= , pa = pa * 1ll * pa % p)
  17. if (pos & )
  18. rt = pa * 1ll * rt % p;
  19. return rt;
  20. }
  21.  
  22. typedef class Matrix {
  23. public:
  24. int col, row;
  25. int a[][max_col];
  26. boolean zero[];
  27.  
  28. int guass(int n) {
  29. int r = ;
  30. memset(zero, true, sizeof(boolean) * row);
  31. for (int i = , cur = -; r < row && i < n; i++, cur = -) {
  32. for (int j = r; j < row && cur == -; j++)
  33. if (a[j][i])
  34. cur = j;
  35. if (cur == -) continue;
  36. zero[r] = false;
  37. if (cur != i)
  38. for (int j = ; j < col; j++)
  39. swap(a[r][j], a[cur][j]);
  40. for (int j = , x, y; j < row; j++) {
  41. if (j == r) continue;
  42. x = a[r][i], y = a[j][i];
  43. for (int k = ; k < col; k++) {
  44. a[j][k] = (a[j][k] * x - a[r][k] * y) % ;
  45. if (a[j][k] < )
  46. a[j][k] += ;
  47. }
  48. }
  49. r++;
  50. }
  51. return r;
  52. }
  53.  
  54. int* operator [] (int p) {
  55. return a[p];
  56. }
  57. }Matrix;
  58.  
  59. int n, m, q;
  60. Matrix mat;
  61. char buf[];
  62.  
  63. inline void init() {
  64. scanf("%d%d", &n, &m);
  65. for (int i = ; i < n; i++) {
  66. scanf("%s", buf);
  67. for (int j = ; j < m; j++)
  68. mat[j][i] = (buf[j] - 'a');
  69. }
  70.  
  71. scanf("%d", &q);
  72. for (int i = ; i < q; i++) {
  73. scanf("%s", buf);
  74. for (int j = ; j < m; j++)
  75. mat[j][n + i] = (buf[j] - 'a');
  76. }
  77. }
  78.  
  79. int ans = ;
  80. boolean hassol[];
  81. inline void solve() {
  82. mat.row = m, mat.col = n + q;
  83. int r = mat.guass(n);
  84. ans = qpow(, n - r, M);
  85. memset(hassol, true, sizeof(boolean) * q);
  86. for (int i = ; i < m; i++)
  87. if (mat.zero[i])
  88. for (int j = ; j < q; j++)
  89. if (mat[i][n + j])
  90. hassol[j] = false;
  91. for (int i = ; i < q; i++)
  92. printf("%d\n", (hassol[i]) ? (ans) : ());
  93. }
  94.  
  95. int main() {
  96. init();
  97. solve();
  98. return ;
  99. }

Codeforces 832E Vasya and Shifts - 高斯消元的更多相关文章

  1. Codeforces Gym10008E Harmonious Matrices(高斯消元)

    [题目链接] http://codeforces.com/gym/100008/ [题目大意] 给出 一个n*m的矩阵,要求用0和1填满,使得每个位置和周围四格相加为偶数,要求1的数目尽量多. [题解 ...

  2. codeforces 24d Broken robot 期望+高斯消元

    题目传送门 题意:在n*m的网格上,有一个机器人从(x,y)出发,每次等概率的向右.向左.向下走一步或者留在原地,在最左边时不能向右走,最右边时不能像左走.问走到最后一行的期望. 思路:显然倒着算期望 ...

  3. Vasya and Shifts CodeForces - 832E (高斯消元)

    大意: 给定$4n$个$m$位的五进制数, $q$个询问, 每个询问给出一个$m$位的五进制数$b$, 求有多少种选数方案可以使五进制异或和为$b$. 高斯消元入门题 每次询问相当于就是给定了$m$个 ...

  4. Codeforces Round #114 (Div. 1) E. Wizards and Bets 高斯消元

    E. Wizards and Bets 题目连接: http://www.codeforces.com/contest/167/problem/E Description In some countr ...

  5. CodeForces 24D Broken robot(期望+高斯消元)

    CodeForces 24D Broken robot 大致题意:你有一个n行m列的矩形板,有一个机器人在开始在第i行第j列,它每一步会随机从可以选择的方案里任选一个(向下走一格,向左走一格,向右走一 ...

  6. Educational Codeforces Round 63 (Rated for Div. 2) E 带模高斯消元

    https://codeforces.com/contest/1155/problem/E 题意 \(f(x)=a_0+a_1x+a_2x^2+...+a_kx^k,k \leq 10,0 \leq ...

  7. Codeforces 446D - DZY Loves Games(高斯消元+期望 DP+矩阵快速幂)

    Codeforces 题目传送门 & 洛谷题目传送门 神仙题,%%% 首先考虑所有格子都是陷阱格的情况,那显然就是一个矩阵快速幂,具体来说,设 \(f_{i,j}\) 表示走了 \(i\) 步 ...

  8. Codeforces.24D.Broken robot(期望DP 高斯消元)

    题目链接 可能这儿的会更易懂一些(表示不想再多写了). 令\(f[i][j]\)表示从\((i,j)\)到达最后一行的期望步数.那么有\(f[n][j]=0\). 若\(m=1\),答案是\(2(n- ...

  9. Codeforces.472F.Design Tutorial: Change the Goal(构造 线性基 高斯消元)

    题目链接 \(Description\) 给定两个长为\(n\)的数组\(x_i,y_i\).每次你可以选定\(i,j\),令\(x_i=x_i\ \mathbb{xor}\ x_j\)(\(i,j\ ...

随机推荐

  1. IE8 CSS hack

    IE8正式版出来有一段日子了,但是针对ie8正式版的CSS hack却很少,其实这是值得庆幸的,因为ie8修复了很多IE6和IE7的一些BUG,更加接近W3C标准. 针对IE8正式版的CSS hack ...

  2. c# webapi 跳转

    c# webapi 跳转  public HttpResponseMessage Post() {     // ... do the job     // now redirect     Http ...

  3. centos6.5安装无线网卡驱动并配置wifi

    1.驱动下载地址: RTL8188无线网卡驱动下载 链接:https://pan.baidu.com/s/1ms-EbQCDxa76jPhYUPmr9Q 密码:r2vu 2.安装步骤: [root@c ...

  4. 水题 O

    Bob 和 Alice 开始使用一种全新的编码系统.它是一种基于一组私有钥匙的.他们选择了n个不同的数a1 , . . .,an, 它们都大于0小于等于n. 机密过程如下:待加密的信息放置在这组加密钥 ...

  5. 《大话设计模式》c++实现 状态模式

    状态模式包含如下角色: Context: 环境类 State: 抽象状态类 ConcreteState: 具体状态类 2)适用场景: a)状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂 ...

  6. STL之Map和multimap容器

    1.Map和multimap容器 1)map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对.它提供基于key的快速检索能力. 2)map中key值是唯一的.集合中的元素按一 ...

  7. 10 enumerate()在字典,列表中的用法详解

    1.字典 li = {"alex"," aric","Alex","Tony","rain"}for ...

  8. JSP FreeMarker Velocity 原理

    JSP原理 JSP的运行原理:JSP 本质上是一个Servlet. 每个JSP 页面在第一次被访问时,JSP引擎将它翻译成一个Servlet 程序,然后再把这个 Servlet 源程序编译成Servl ...

  9. Java综合高级篇

    1.你用过哪些集合类? 大公司最喜欢问的Java集合类面试题 40个Java集合面试问题和答案 java.util.Collections 是一个包装类.它包含有各种有关集合操作的静态多态方法. ja ...

  10. Shell 脚本编程基础

    通过本文记录学习Linux Shell的一些笔记思考和总结,以加强记忆和理解.主要学习参考资料有: 1.<鸟哥的Linux私房菜-基础篇>第四版 2.菜鸟教程——Linux教程 3.ear ...