题目链接:点击打开链接
题目大意:有一n*m(1<n,m<=30)的矩阵,每个位置取值为{0,1,2},所有的运算都在mod3域下进行。有一种操作,使得某个位置+2,并且上下左右相邻位置+1。输出操作序列(操作数量<=2*m*n)使得所有的位置都为0。
分析:由题意可知,所有的操作也是模3 域下的,也就是说如果有解的话,除去无效操作,操作总数一定<=2*m*n。
只需要解一个模3的线性方程组即可,未知量数为n*m个,表示从全为0的状态变为当前状态该位置进行了几次操作。
注意,可能存在无穷组解,只需要任意确定自由元即可得到一个解。
对得到的解求其模3的补即是答案。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cmath>
#include <set>
#include <map>
#include <bitset>
using namespace std;
typedef long long ll;
const int mod = 1000000003;
const double eps = 1e-6;
const int inf = 0x3f3f3f3f;
const ll INF = 100000000000000000ll;
int mat[40][40],n,m;
const int MAXN=1805;
int a[MAXN][MAXN];//增广矩阵
int x[MAXN];//解集
bool free_x[MAXN];//标记是否是不确定的变元
inline int gcd(int a,int b)
{
int t;
while(b!=0)
{
t=b;
b=a%b;
a=t;
}
return a;
}
inline int lcm(in