hdu 5755 Gambler Bo 高斯消元
给n*m的方格, 每个格子有值{0, 1, 2}。 然后可以对格子进行操作, 如果选择了一个格子, 那么这个格子的值+2, 这个格子上下左右的格子+1, 并且模3。
问你将所有格子变成0的操作方法。
其实就是一个模3的方程组, 高斯消元就可以了。 不知道为什么昨天比赛就是想不到......
#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <complex>
#include <cmath>
#include <map>
#include <set>
#include <string>
#include <queue>
#include <stack>
#include <bitset>
using namespace std;
#define pb(x) push_back(x)
#define ll long long
#define mk(x, y) make_pair(x, y)
#define lson l, m, rt<<1
#define mem(a) memset(a, 0, sizeof(a))
#define rson m+1, r, rt<<1|1
#define mem1(a) memset(a, -1, sizeof(a))
#define mem2(a) memset(a, 0x3f, sizeof(a))
#define rep(i, n, a) for(int i = a; i<n; i++)
#define fi first
#define se second
typedef complex <double> cmx;
typedef pair<int, int> pll;
const double PI = acos(-1.0);
const double eps = 1e-;
const int mod = ;
const int inf = ;
const int dir[][] = { {-, }, {, }, {, -}, {, } };
int a[][];
int n, b[], x[], m;
int gcd(int a, int b)
{
return b?gcd(b, a%b):a;
}
int lcm(int a, int b)
{
return a/gcd(a, b)*b;
}
ll inv(ll a, ll m)
{
if(a == )
return ;
return inv(m%a, m)*(m-m/a)%m;
}
int gauss(int equ, int var)
{
int max_r, col, k;
for(k = , col = ; k < equ && col < var; k++, col++) {
max_r = k;
for(int i = k + ; i < equ; i ++) {
if(abs(a[i][col]) > abs(a[max_r][col]))
max_r = i;
}
if(a[max_r][col] == ) {
k--;
continue;
}
if(max_r != k) {
for(int j = col; j < var+; j++) {
swap(a[k][j], a[max_r][j]);
}
}
for(int i = k + ; i < equ; i++) {
if(a[i][col]) {
int LCM = lcm(abs(a[i][col]), abs(a[k][col]));
int ta = LCM/abs(a[i][col]);
int tb = LCM/abs(a[k][col]);
if(a[i][col] * a[k][col] < )
tb = -tb;
for(int j = col; j < var+; j++) {
a[i][j] = ((a[i][j]*ta - a[k][j]*tb)%mod+mod)%mod;
}
}
}
for(int i = var-; i >= ; i--) {
int tmp = a[i][var];
for(int j = i+; j < var; j++) {
if(a[i][j]) {
tmp -= a[i][j]*x[j];
tmp = (tmp%mod+mod)%mod;
}
}
x[i] = a[i][i]*tmp%mod;
}
}
}
int check(int x)
{
return x >= && x < n*m;
}
int main()
{
int t;
cin>>t;
while(t--) {
scanf("%d%d", &n, &m);
for(int i = ; i < n*m; i++) {
scanf("%d", &b[i]);
}
mem(x);
mem(a);
for(int i = ; i < n*m; i++) {
int u = i-m, d = i+m;
int l = i-, r = i+;
if(check(u)) {
a[i][u] = ;
}
if(check(d)) {
a[i][d] = ;
}
if(check(l)&&i%m!=) {
a[i][l] = ;
}
if(check(r)&&(i+)%m!=) {
a[i][r] = ;
}
a[i][i] = ;
a[i][n*m] = (-b[i])%;
}
n *= m;
gauss(n, n);
int cnt = ;
for(int i = ; i < n; i++) {
if(x[i])
cnt += x[i];
}
printf("%d\n", cnt);
for(int i = ; i < n; i++) {
while(x[i]) {
printf("%d %d\n", i/m+, i%m+);
x[i]--;
}
}
}
return ;
}
hdu 5755 Gambler Bo 高斯消元的更多相关文章
- hdu 5755 2016 Multi-University Training Contest 3 Gambler Bo 高斯消元模3同余方程
http://acm.hdu.edu.cn/showproblem.php?pid=5755 题意:一个N*M的矩阵,改变一个格子,本身+2,四周+1.同时mod 3;问操作多少次,矩阵变为全0.输出 ...
- Gambler Bo (高斯消元求特解)
对于图中的每一个点假设点击Xi * m + j 然后每个点都有那么对于每一个点可以列举出一个方程式,n*m个点解n*m个未知数.利用高斯消元就可以解决. 问题就在这个题目可能不止有一个特,所以我们需要 ...
- HDU 5755 Gambler Bo(高斯消元)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5755 [题目大意] 一个n*m由0,1,2组成的矩阵,每次操作可以选取一个方格,使得它加上2之后对 ...
- HDU 4870 Rating(高斯消元 )
HDU 4870 Rating 这是前几天多校的题目,高了好久突然听旁边的大神推出来说是可以用高斯消元,一直喊着赶快敲模板,对于从来没有接触过高斯消元的我来说根本就是一头雾水,无赖之下这几天做DP ...
- HDU 3949 XOR(高斯消元)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3949 题意:给出一个长度为n的数列A.选出A的所有子集(除空集外)进行抑或得到2^n-1个数字,去重排 ...
- [hdu 3949]线性基+高斯消元
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3949 一开始给做出来的线性基wa了很久,最后加了一步高斯消元就过了. 之所以可以这样做,证明如下. 首 ...
- HDU 3949 XOR(高斯消元搞基)
HDU 3949 XOR pid=3949" target="_blank" style="">题目链接 题意:给定一些数字,问任取几个异或值第 ...
- HDU 3364 Lanterns (高斯消元)
题意:有n个灯和m个开关,每个开关控制数个灯的状态改变,给出k条询问,问使灯的状态变为询问中的状态有多少种发法. 析:同余高斯消元法,模板题,将每个开关控制每个灯列成行列式,最终状态是结果列,同余高斯 ...
- [ACM] hdu 4418 Time travel (高斯消元求期望)
Time travel Problem Description Agent K is one of the greatest agents in a secret organization calle ...
随机推荐
- HDU 5727 - Necklace
题意:( 0 <= n <= 9 ) 现在有n颗阴珠子和n颗阳珠子,将它们阴阳相间圆排列构成一个环, 已知有些阴珠子和阳珠子不能放在相邻的位置,否则这颗阳珠子就会失去功效, ...
- Java代理模式——静态代理模式
一:代理模式 代理模式的作用是:为其他对象提供一种代理以控制这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 二:代理模式设计 ...
- Git 介绍
一,理解 Git 1,分布式版本控制 Git 版本控制系统的设计思想是"去中心化".传统的 CVS .SVN 等工具采用的是 C/S 架构,只有一个中心代码仓库,位于服务器端.而一 ...
- Android学习笔记——Activity的启动和创建
http://www.cnblogs.com/bastard/archive/2012/04/07/2436262.html Android Activity学习笔记——Activity的启动和创建 ...
- KeybMap 键盘映射工具更新至 V1.5(修订)
KeybMap 更新至 V1.5,主要是增加了对一些多媒体键定义修改功能,也可以将任意一键定义为打开指定的程序. 3月9日略做修订. http://www.mympc.org/down/1/2005- ...
- 软件看门狗--别让你地程序无响应(使用未公开API函数IsHungAppWindow,知识点较全)
正文一.概述一些重要的程序,必须让它一直跑着:而且还要时时关心它的状态——不能让它出现死锁现象.当然,如果一个主程序会出现死锁,肯定是设计或者编程上的失误.我们首要做的事是,把这个Bug揪出来.但如果 ...
- 解决C/C++程序执行一闪而过的方法(三种办法)
简述 在VS编写控制台程序的时候,包括使用其他IDE(Visual C++)编写C/C++程序,经常会看到程序的执行结果一闪而过,要解决这个问题,可以在代码的最后加上system(“pause”).g ...
- Nutch环境搭建
1. 环境准备 HOST:Ubuntu12.04LTS JDK: jdk-7u45-linux-i586.rpm Nutch:apache-nutch-1.7-bin.tar.gz Solr:solr ...
- 关于k-means聚类算法的matlab实现
在数据挖掘中聚类和分类的原理被广泛的应用. 聚类即无监督的学习. 分类即有监督的学习. 通俗一点的讲就是:聚类之前是未知样本的分类.而是根据样本本身的相似性进行划分为相似的类簇.而分类 是已知样本分类 ...
- 从txt中读入数据到数组中(fscanf)
C-sources: #include<stdio.h> int main() { FILE* fp; //定义一个文件 fp = fopen("p5.txt",&qu ...