• 高斯消元与xor方程组


    for(i=1;i<=n;i++)
    {
      for(j=i+1;j<=n;j++)
        if(a[j]>a[i]) swap(a[i],a[j]);
      if(!a[i]) break;
      for(j=60;j>=0;j--)
        if(a[i]>>j&1)
        {
          for(k=1;k<=n;k++)
            if(i!=k && (a[k]>>j&1)) a[k]^=a[i];
          break;
        }
    }

    对着这个代码思(dan)考(teng)了一星期。。。

    UPD:好像这两份代码干的事情一样?做完之后每一个数的最高位上只有这一个1。T_T谁能告诉我这两份代码有什么区别?各有什么用?还有为什么要这么做?

    for(int i=1;i<=n;i++)
    for(int j=64;j>=1;j--)
    {
        if(a[i]>>(j-1)&1)
        {
            if(!lb[j]){lb[j]=a[i];break;}
            else a[i]^=lb[j];
        }
    }

    我们来证明一下,为什么消了元之后的a数组的任何一种选法对应原数组的一种选法?(SX问题,神犇请无视T_T)

    假如我们有一个集合S=[x,S-{x}],那么对集合S选取的一种方案可以对应到S'=[x,{y^x|y∈{S-{x}}}]

    令S-{X}=A,{y^x|y∈{S-{x}}}=B

    因为假如这个方案

    1)选x

        i)另外选了奇数个A中的元素,那么S‘中的方案对应为  不选x,在B中选对应的元素

        ii)另外选了偶数个A中的元素,那么S’中的方案对应为  选x,在B中选对应的元素

    2)不选x

         i)另外选了奇数个A中的元素,那么S‘中的方案对应为  选x,在B中选对应的元素

         ii)另外选了偶数个A中的元素,那么S’中的方案对应为  不选x,在B中选对应的元素

    所以这是一一对应的。所以我们就可以随便用某个方程取异或其它方程,选与不选还是相互独立且合法的。

    (咦?我怎么想到了矩阵的初等变换?)

    求大神给出简单证明T_T

  • 相关阅读:
    c#随便写写 数据层和表现层,队列执行
    unity代码设置鼠标样式
    Unity c#反射查找类中符合条件的方法并执行
    封装你的协程Unity TaskManager
    基于steamworks获取steam用户头像
    开启Unity项目中VS工程的属性面板
    移动端的动态阴影
    c#静态扩展方法,字典的克隆扩展方法
    Unity热更方案汇总
    lua输入函数名字符串执行函数
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/4231891.html
Copyright © 2020-2023  润新知