异或方程组matlab代码,XOR专题(一):异或方程组的解法

#include#include#include#includeusingnamespacestd;#definere(i, n) for (int i=0; i=0; i--)#definerre1(i, n) for (int i=n; i>0; i--)#definerre2(i, r, l) for (int i=r-1; i>=l; i--)#definerre3(i, r, l) for (int i=r; i>=l; i--)#definell long longconstintMAXN=2005, KS=32, MAXN0=(MAXN+1)/KS+1, INF=~0U>>2;intn, n0, q, A[MAXN][MAXN0], B[MAXN];boolC[MAXN], res[MAXN], res_ex=1;voidinit()

{

freopen("arc.in","r", stdin);intq0=0, q1=0, x, y, _q0, _q1;

scanf("%d",&n); n0=n/KS; q=n%KS;

re(i, n) {

scanf("%d",&x);if(x&1) {A[i][q0]|=1<

re(j, x) {

scanf("%d",&y); y--; _q0=y/KS; _q1=y%KS;

A[i][_q0]|=1<<_q1>

}if(q1==KS-1) {q0++; q1=0;}elseq1++;

}

fclose(stdin);

}voidsolve()

{

re(i, n) B[i]=-1;intq0, q1, x;

re(i, n) {

q0=q1=0;

re(j, n) {if(A[i][q0]&(1<

x=B[j];if(x==-1) {B[j]=i;break;}elsere3(k, q0, n0) A[i][k]^=A[x][k];

}if(q1==KS-1) {q0++; q1=0;}elseq1++;

}

}

q0=n0; q1=q;

rre(i, n) {if(q1) q1--;else{q0--; q1=KS-1;}if((x=B[i])>=0) {

res[i]=A[x][n0]&(1<

re(j, n)if(j!=x&&(A[j][q0]&(1<

A[j][q0]^=A[x][q0];if(q0

}

}else{

res[i]=1;

re(j, n)if(A[j][q0]&(1<

A[j][q0]&=~(1<

}

}

}

re(i, n)if((x=B[i])>=0) C[x]=1;

re(i, n)if(!C[i]&&(A[i][n0]&(1<

}voidpri()

{

freopen("arc.out","w", stdout);if(res_ex) {intsum=0;boolSPC=0; re(i, n)if(!res[i]) sum++;

printf("%d\n", sum);

re(i, n)if(!res[i]) {if(SPC) putchar('');elseSPC=1;

printf("%d", i+1);

}

puts("");

}elseputs("Impossible");

fclose(stdout);

}intmain()

{

init();

solve();

pri();return0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值