2016-07-27 14:23:49
【傳送門】
題意:給出 n*m 的矩陣,每個元素為 0 或 1 或 2,每次操作可以選擇乙個元素給他加2,且其上下左右的格仔裡的數加1,所有操作都在模3域內操作。
問乙個可行的操作方案,使得方案總數不超過 2 * n * m 。 1 <= n , m <= 30
思路:這題雖然可以暴力建出 900 * 900 的矩陣進行 900^3 的高斯消元,也能過。但是有更好的方法。
首先設第一行每列的元素被操作多少次,設為 x1,x2 ... xm ,這樣一來,第二行每列元素的操作次數也能確定,可以用 x1~xm 去表示,以此類推,第三行、第四行 ... 第 n 行 所有元素的操作次數都能被確定。
我們發現第 i + 1 行操作完後,第 i 行就能全部變為 0,且不受後面的操作影響。唯一不能保證全零的是第 n 行,所以第 n 行的 m 個元素都要為 0,我們已經知道了他們的操作次數(用 x1~xn表示)。
所以我們可以建立 m 條方程,每個方程 m 個變數進行高斯消元,解出解後代回去得到每個元素應該被操作的次數(一定 <= 2)。複雜度 o(m^3)
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include8 #include 9 #include 10 #include 11 #include
12 #include 13 #include 14
using
namespace
std;
1516
#define getmid(l,r) ((l) + ((r) - (l)) / 2)
17#define mp(a,b) make_pair(a,b)
18#define pb(a) push_back(a)
1920 typedef long
long
ll;21 typedef unsigned int
ui;22 typedef pairpii;
23const
double eps = 1e-8;24
const
int inf = (1
<< 30) - 1;25
const
int maxn = 910;26
27int
t,n,m,top;
28int a[50][50][50],b[50][50][50],g[50][50],tg[50][50
];29
int g[50][50],x[50],x[3000],y[3000
];30
int dir[4][2] = ,,,};
3132
void
gauss()
39if(r == -1)43
if(r != i) for(int j = col; j <= m + 1; ++j) swap(g[i][j],g[r][j]);
44for(int k = i + 1; k <= m; ++k)50}
51}52}
53int
pos;
54for(int i = m; i >= 1; --i)
60 x[pos] = g[i][m + 1
];61
if(g[i][pos] == 2) x[pos] ^= 3;62
}63}64
65int
main()
84for(int i = 2; i <= n; ++i)94}
95}96for(int i = 1; i <= m; ++i)
100 g[i][m + 1] = ((3 - g[i][m + 1]) % 3 + 3) % 3
;101
}102
gauss();
103int cnt = 0
;104
for(int i = 1; i <= n; ++i)
110while(ans--)
114}
115}
116 printf("
%d\n
",cnt);
117for(int i = 1; i <= cnt; ++i) printf("
%d %d\n
",x[i],y[i]);
118}
119return0;
120 }
HDU 5755 高斯消元
題意 給出乙個模3意義下的矩陣,每次選中乙個元素就可以使得自身 2,上下左右元素 1。求所有元素變成0的一種解。o nm 3 怎麼會不炸!怎麼會不炸!好吧就是不炸,可能在消元的時候0比較多吧 可以為什麼不用列舉自由元呢?不是很懂這個資料 直接按照上下左右自身的元素對自己的貢獻建立方程組暴力消元,遇到...
高斯消元 求解模線性方程 HDU5755
題目大意 給你乙個二維的模3意義下的矩陣。選擇乙個位置可以使得該位置 2,其他相鄰四個位置 1.讓你將其變成全0矩陣。在2nm 2nm2n m次操作內.n m 30 n,m leq 30 n,m 30 題目思路 洛谷p3164一樣的思路。其實異或線性方程就是模2意義的高斯消元嘛。本質一樣。那麼求解模...
高斯消元 浮點高斯消元
浮點數高斯消元 問題描述 給出乙個線性方程組,有n個方程組,m個未知數。解這個線性方程組。輸入格式 第1行 2個整數n和m,n,m 400,且n不一定等於m 接下來n行,每行m 1個整數,表示乙個方程的m個未知數的係數和常數 輸出格式 如果無解,輸出 no solution 如果有唯一解,輸出m行,...