题目传送门

  快速的传送门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

 /**
* Codeforces
* Problem#832E
* Accepted
* Time: 826ms
* Memory: 3600k
*/
#include <bits/stdc++.h>
using namespace std;
typedef bool boolean; const int M = 1e9 + , max_col = ; int qpow(int a, int pos, int p) {
int pa = a, rt = ;
for ( ; pos; pos >>= , pa = pa * 1ll * pa % p)
if (pos & )
rt = pa * 1ll * rt % p;
return rt;
} typedef class Matrix {
public:
int col, row;
int a[][max_col];
boolean zero[]; int guass(int n) {
int r = ;
memset(zero, true, sizeof(boolean) * row);
for (int i = , cur = -; r < row && i < n; i++, cur = -) {
for (int j = r; j < row && cur == -; j++)
if (a[j][i])
cur = j;
if (cur == -) continue;
zero[r] = false;
if (cur != i)
for (int j = ; j < col; j++)
swap(a[r][j], a[cur][j]);
for (int j = , x, y; j < row; j++) {
if (j == r) continue;
x = a[r][i], y = a[j][i];
for (int k = ; k < col; k++) {
a[j][k] = (a[j][k] * x - a[r][k] * y) % ;
if (a[j][k] < )
a[j][k] += ;
}
}
r++;
}
return r;
} int* operator [] (int p) {
return a[p];
}
}Matrix; int n, m, q;
Matrix mat;
char buf[]; inline void init() {
scanf("%d%d", &n, &m);
for (int i = ; i < n; i++) {
scanf("%s", buf);
for (int j = ; j < m; j++)
mat[j][i] = (buf[j] - 'a');
} scanf("%d", &q);
for (int i = ; i < q; i++) {
scanf("%s", buf);
for (int j = ; j < m; j++)
mat[j][n + i] = (buf[j] - 'a');
}
} int ans = ;
boolean hassol[];
inline void solve() {
mat.row = m, mat.col = n + q;
int r = mat.guass(n);
ans = qpow(, n - r, M);
memset(hassol, true, sizeof(boolean) * q);
for (int i = ; i < m; i++)
if (mat.zero[i])
for (int j = ; j < q; j++)
if (mat[i][n + j])
hassol[j] = false;
for (int i = ; i < q; i++)
printf("%d\n", (hassol[i]) ? (ans) : ());
} int main() {
init();
solve();
return ;
}

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. ssdb使用笔记

    ssdb是一款类似于redis的nosql数据库,不过redis是基于内存的,服务器比较昂贵,ssdb则是基于硬盘存储的,很容易扩展,对于一些对速度要求不是太高的应用,还是不错的选择. 先记录一个比较 ...

  2. hive中安装hive_utils模块

    1. 因为在linux部署的python 3.6 在安装模块的时候遇到了许多问题,所以使用linux中的python3.6环境 2. 首先使用pip安装 hive_utils 模块sudo pip i ...

  3. java 中使用ajax调用后台方法注意事项

    java 中使用ajax调用后台方法注意事项,后台方法一定要加@ResponseBody jQuery.validator.addMethod("checkRuleName",fu ...

  4. sqlserver Distributed Transaction 分布式事务

    在webapi+ef+sqlserver开发项目时,利用transcope实现应用层级的事务时,偶尔会报分布式事务错误,而且很而复现,特别蛋疼.现将自己的解决方法初步整理下. 分析原因:搭建repos ...

  5. Unity之Vector3.SignedAngle实现

    如代码: float angle = Vector3.Angle(v1, v2); angle *= Mathf.Sign(Vector3.Cross(v1, v2).y);

  6. 7.线程id,优先级讲解

    1.线程id可以通过Thread对象的getId()方法得到,在线程出了问题,为什么CPU占用这么高的时候,查的时候我们可以在堆栈信息中找到对应线程,然后干掉该线程就好! 2.而线程对象的getNam ...

  7. GZIPOutputStream GZIPInputStream

    GZIP is appropriate for single data stream. Example: Compress one file public class Demo8 {  public ...

  8. webservice 生成客户端代码

    使用 jdk 自带工具 wsimport wsimport -keep http://webservice/url?wsdl

  9. modelform的简介

    Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...

  10. PIVOT(透视转换)和UNPIVOT(逆透视转换)

    一.原数据状态 二.手动写透视转换1 三.手动写透视转换2 四.PIVOT(透视转换)和UNPIVOT(逆透视转换)详细使用 使用标准SQL进行透视转换和逆视转换 --行列转换 create tabl ...