P10499 解题报告
题目传送门
题目大意:
有
现给出这
思路:
高斯消元解异或方程组经典题。
先考虑将原题抽象成方程组。
令
令
再根据操作效果:
所以可以列出以下方程组:
异或其实就是不进位加法,所以也可以用高斯消元来解,将加减法换为异或就行了。
这道题要求操作方案数,那么找自由元的数量就好了。因为若某个未知数是自由元,那么它取
同时由于系数只能为
#include <cmath>
#include <bitset>
#include <iostream>
using namespace std;
const int N = 35;
int T;
int n;
bitset<N> a[N];
int ans;
int gauss() {
int c, r;
for(c = 0, r = 0; c < n; c++) {
int t = r;
for(int i = r + 1; i < n; i++)
if(a[i][c]) {
t = i;
break;
}
if(!a[t][c]) continue;
if(t != r) swap(a[t], a[r]);
for(int i = r + 1; i < n; i++)
if(a[i][c])
a[i] = a[i] ^ a[r];
++r;
}
if(r < n) {
for(int i = r; i < n; i++) {
if(a[i][n])
return -1;
}
ans = 1 << n - r;
return 0;
}
return 1;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> T;
while(T--) {
cin >> n;
ans = 1;
int x;
for(int i = 0; i < n; i++)
a[i].reset(), a[i].set(i, 1);
for(int i = 0; i < n; i++) {
cin >> x;
a[i][n] = x;
}
for(int i = 0; i < n; i++) {
cin >> x;
a[i][n] = a[i][n] ^ x;
}
int y;
while(cin >> x >> y && x && y)
a[y - 1].set(x - 1, 1);
int type = gauss();
if(type >= 0) cout << ans << '\n';
else cout << "Oh,it's impossible~!!" << '\n';
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具