0x35 高斯消元与线性空间

Posted akcqhzdy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了0x35 高斯消元与线性空间相关的知识,希望对你有一定的参考价值。

颓了十天回来做题果然……

感觉还是很有收获的,这两以前都没学过

bzoj1013: [JSOI2008]球形空间产生器sphere

poj1830 异或也可以当作加减那样做的。。。起始状态异或结束状态就得出答案,设的就是某个灯点不点

技术分享图片
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;

int n;
int gq[40][40],gc[40];
int guass()
{
    int ch=n,fr=0;
    for(int j=1;j<=n;j++)
    {
        for(int i=j;i<=n;i++)
            if(gq[i][j]>0)
            {
                for(int k=1;k<=n;k++)swap(gq[i][k],gq[j][k]);
                swap(gc[i],gc[j]);
                break;
            }
        if(gq[j][j]==0)
        {
            if(gc[j]==1)return 0;
            else {fr++;continue;}
        }
        for(int i=1;i<=n;i++)
        {
            if(i==j)continue;
            if(gq[i][j]==1)
            {
                for(int k=j;k<=n;k++)gq[i][k]^=gq[j][k];
                gc[i]^=gc[j];
            }
        }
    }
    return 1<<fr;
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int x,y;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&gc[i]);
        for(int i=1;i<=n;i++)
            scanf("%d",&x), gc[i]^=x;
            
        memset(gq,0,sizeof(gq));
        for(int i=1;i<=n;i++)gq[i][i]=1;
        while(scanf("%d%d",&x,&y)!=EOF)
        {
            if(x==0&&y==0)break;
            gq[x][y]=1;
        }
        
        int ans=guass();
        if(ans==0)printf("Oh,it‘s impossible~!!
");
        else printf("%d
",ans);
    }
    return 0;
}
poj1830

bzoj4004: [JLOI2015]装备购买

hdu3949 求第k大。其实本质就是用高斯消元的思想,把每一位独立出来

技术分享图片
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef unsigned long long uLL;
const uLL maxp=(1LL<<63);

uLL lt[110];bool bk;
void insert(uLL x)
{
    uLL Bin=maxp;
    for(int i=63;i>=0;i--)
    {
        if(x&Bin)
        {
            if(lt[i]==0)
                {lt[i]=x;return ;}
            else
                x^=lt[i];
        }
        Bin>>=1;
    }
    bk=true;
}
uLL plen,p[110];
void rebuild()
{
    uLL Bin1=maxp;
    for(int i=63;i>=0;i--)
    {
        if(lt[i]!=0)
        {
            uLL Bin=(Bin1>>1);
            for(int j=i-1;j>=0;j--)
            {
                if(lt[i]&Bin)
                    lt[i]^=lt[j];
                Bin>>=1;
            }
        }
        Bin1>>=1;
    }
    plen=0;
    for(int i=0;i<=63;i++)
        if(lt[i]!=0)p[plen++]=lt[i];
    
}
void findkth(uLL x)
{
    if(bk==true)
    {
        x--;
        if(x==0){printf("0
");return ;}
    }
    if(x>=(1LL<<plen)){printf("-1
");return ;}
    
    uLL ans=0,Bin=maxp;
    for(int i=63;i>=0;i--)
    {
        if(x&Bin)
            ans^=p[i];
        Bin>>=1;
    }
    printf("%I64u
",ans);
}

uLL a[11000];
bool cmp(uLL n1,uLL n2){return n1>n2;}
int main()
{
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    
    int T,T_T=0;
    scanf("%d",&T);
    while(T--)
    {
        printf("Case #%d:
",++T_T);
        
        int n;uLL x;
        scanf("%d",&n);bk=false;
        for(int i=1;i<=n;i++)
        {
            scanf("%I64u",&a[i]);
            if(a[i]==0)bk=true;
        }
        sort(a+1,a+n+1,cmp);
        memset(lt,0,sizeof(lt));
        for(int i=1;i<=n;i++)insert(a[i]);
        
        scanf("%d",&n);rebuild();
        while(n--)
            scanf("%I64u",&x), findkth(x);
    }
    return 0;
}
hdu3949

 

以上是关于0x35 高斯消元与线性空间的主要内容,如果未能解决你的问题,请参考以下文章

高斯消元与线性空间

高斯消元与线性空间

线性空间和异或空间(线性基)bzoj4004贪心+高斯消元

4. 数学知识

[JSOI2008]球形空间产生器(线性代数+高斯消元)

[JLOI2015]装备购买 (高斯消元)