高斯消元法解异或方程组 模板

来源:互联网 发布:豆瓣知乎的运营方式 编辑:程序博客网 时间:2024/05/22 06:31

写过才发现与实数的线性方程组不同,但不过更为容易,且不用考虑精度等问题。

该类算法的应用在于一系列开关问题等等经典模型。

Code : (未回代求解)

#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#define maxn 35int n, m, k;int a[maxn], b[maxn];void swap(int & a, int & b){int c = a; a = b; b = c;}int calc(){int j = 1, k, ans = 0;for (int i = 1; i <= n; ++ i){for (k = j; k <= n && ! ((a[k] >> i) & 1); ++ k);if (k <= n){swap(a[k], a[j]);for (k = j + 1; k <= n; ++ k)if ((a[k] >> i) & 1) a[k] ^= a[j];++ j;}else ++ ans;}for (int i = 1; i <= n; ++ i)if (a[i] == 1) return - 1;return 1 << ans;}int main(){freopen("input.txt", "r", stdin);freopen("output.txt", "w", stdout);for (scanf("%d", & k); k --; ){scanf("%d", & n), memset(a, 0, sizeof a);for (int i = 1; i <= n; ++ i) scanf("%d", b + i), a[i] |= 1 << i;for (int i = 1; i <= n; ++ i) scanf("%d", & m), a[i] |= m != b[i];for (int i, j; scanf("%d%d", & i, & j), i && j; ) a[j] |= 1 << i;if (~ (m = calc())) printf("%d\n", m);else puts("Oh,it's impossible~!!");}return 0;}


原创粉丝点击