POJ 1222 EXTENDED LIGHTS OUT

//https://www.cnblogs.com/Empress/p/4156234.html
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int x[31],a[31][31],ca,T,i,j,n,m,t;
void gauss(int n,int m){
    int k,col=0;
    for (k=0;k<n && col<m;k++,col++){
        int mx=k;
        for (int i=k+1;i<n;i++)
            if (a[i][col]>a[mx][col]) mx=i;
        if (mx!=k)
            for (int i=col;i<=m;i++) swap(a[k][i],a[mx][i]);
        if (!a[k][col]){
            k--;
            continue;
        }
        for (int i=k+1;i<n;i++)
            if (a[i][col])
                for (int j=col;j<=m;j++) a[i][j]^=a[k][j];
    }
    for (int i=m-1;i>=0;i--){
        x[i]=a[i][m];
        for (int j=i+1;j<m;j++) x[i]^=a[i][j] && x[j];
    }
}
int main(){
    scanf("%d",&T);
    n=5;m=6;
    while (T--){
        printf("PUZZLE #%d\n",++ca);
        memset(a,0,sizeof(a));
        memset(x,0,sizeof(x));
        for (i=0;i<n;i++)
            for (j=0;j<m;j++){
                t=i*m+j;
                a[t][t]=1;
                if (i) a[(i-1)*m+j][t]=1;
                if (i<n-1) a[(i+1)*m+j][t]=1;
                if (j) a[i*m+j-1][t]=1;
                if (j<m-1) a[i*m+j+1][t]=1;
            }
        for (i=0;i<n;i++)
            for (j=0;j<m;j++) scanf("%d",&a[i*m+j][n*m]);
        gauss(n*m,n*m);
        for (i=0;i<n;i++)
            for (j=0;j<m;j++) printf("%d%c",x[i*m+j],j==m-1?'\n':' ');
    }
}

POJ 1681 Painter’s Problem

//https://www.cnblogs.com/kuangbin/archive/2012/08/31/2665913.html
//本来这题要枚举自由元的,但因为数据水,所以过了 
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int x[230],a[230][230],ans,i,j,n,T,t;
char s[16];
int gauss(int n,int m){
    int k,col=0;
    for (k=0;k<n && col<m;k++,col++){
        int mx=k;
        for (int i=k+1;i<n;i++)
            if (a[i][col]>a[mx][col]) mx=i;
        if (mx!=k)
            for (int i=col;i<=m;i++) swap(a[k][i],a[mx][i]);
        if (!a[k][col]){
            k--;
            continue;
        }
        for (int i=k+1;i<n;i++)
            if (a[i][col])
                for (int j=col;j<=m;j++) a[i][j]^=a[k][j];
    }
    for (int i=k;i<n;i++)
        if (a[i][col]) return -1;
    for (int i=m-1;i>=0;i--){
        x[i]=a[i][m];
        for (int j=i+1;j<m;j++) x[i]^=a[i][j] && x[j];
    }
    return 0;
}
int main(){
    scanf("%d",&T);
    while (T--){
        memset(a,0,sizeof(a));
        memset(x,0,sizeof(x));
        scanf("%d",&n);
        for (i=0;i<n;i++){
            scanf("%s",s);
            for (j=0;j<n;j++) a[i*n+j][n*n]=(s[j]=='w');
        }
        for (i=0;i<n;i++)
            for (j=0;j<n;j++){
                t=i*n+j;
                a[t][t]=1;
                if (i) a[(i-1)*n+j][t]=1;
                if (i<n-1) a[(i+1)*n+j][t]=1;
                if (j) a[i*n+j-1][t]=1;
                if (j<n-1) a[i*n+j+1][t]=1;
            }
        if (gauss(n*n,n*n)==-1){
            puts("inf");
            continue;
        }
        ans=0;
        for (i=0;i<n*n;i++) ans+=x[i];
        printf("%d\n",ans);
    }
}

POJ 1753 Flip Game

//https://www.cnblogs.com/alihenaixiao/p/4621918.html
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int x[17],a[17][17],mn,n,i,fi[17],fnum[17],b[17];
char s[5][5];
int gauss(int n,int m){
    int k,col=0,cnt=0;
    memset(fi,0,sizeof(fi));
    memset(b,0,sizeof(b));
    for (k=0;k<n && col<m;k++,col++){
        int mx=k;
        for (int i=k+1;i<n;i++)
            if (a[i][col]>a[mx][col]) mx=i;
        if (mx!=k)
            for (int i=col;i<=m;i++) swap(a[k][i],a[mx][i]);
        if (!a[k][col]){
            fi[col]=1;
            b[cnt++]=col;
            k--;
            continue;
        }
        for (int i=k+1;i<n;i++)
            if (a[i][col])
                for (int j=col;j<=m;j++) a[i][j]^=a[k][j];
    }
    for (int i=k;i<n;i++)
        if (a[i][col]) return 1e9;
    int res=1e9;
    for (int i=0;i<1<<cnt;i++){
        int nu=0,tmp=i;
        memset(fnum,0,sizeof(fnum));
        for (int j=0;j<cnt;j++){
            if (tmp&1) fnum[b[j]]=1,nu++;
            tmp>>=1;
        }
        for (int j=k-1;j>=0;j--)
            if (!fi[j]){
                int temp=a[j][m];
                for (int l=j+1;l<m;l++)
                    if (a[j][l]) temp^=fnum[l];
                fnum[j]=temp;
                if (temp) nu++;
            }
        res=min(res,nu);
    }
    return res;
}
void solve(char c){
    memset(a,0,sizeof(a));
    memset(x,0,sizeof(x));
    for (int i=0;i<n;i++)
        for (int j=0;j<n;j++) a[i*n+j][n*n]=(s[i][j]==c);
    for (int i=0;i<n;i++)
        for (int j=0;j<n;j++){
            int t=i*n+j;
            a[t][t]=1;
            if (i) a[(i-1)*n+j][t]=1;
            if (i<n-1) a[(i+1)*n+j][t]=1;
            if (j) a[i*n+j-1][t]=1;
            if (j<n-1) a[i*n+j+1][t]=1;
        }
    mn=min(mn,gauss(n*n,n*n));
}
int main(){
    n=4;
    for (i=0;i<n;i++) scanf("%s",s[i]);
    mn=1e9;
    solve('w');
    solve('b');
    if (mn==1e9) puts("Impossible");
    else printf("%d",mn);
}

POJ 1830 开关问题

//https://www.cnblogs.com/shenben/p/6265976.html
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int ans,n,i,a[30][30],b[30],x,y,T;
int gauss(int n,int m){
    int k,col=0;
    for (k=0;k<n && col<m;k++,col++){
        int mx=k;
        for (int i=k+1;i<n;i++)
            if (a[i][col]>a[mx][col]) mx=i;
        if (mx!=k)
            for (int i=col;i<=m;i++) swap(a[k][i],a[mx][i]);
        if (!a[k][col]){
            k--;
            continue;
        }
        for (int i=k+1;i<n;i++)
            if (a[i][col])
                for (int j=col;j<=m;j++) a[i][j]^=a[k][j];
    }
    for (int i=k;i<n;i++)
        if (a[i][col]) return -1;
    return m-k;
}
int main(){
    scanf("%d",&T);
    while (T--){
        scanf("%d",&n);memset(a,0,sizeof(a));
        for (i=0;i<n;i++) scanf("%d",&b[i]);
        for (i=0;i<n;i++) scanf("%d",&a[i][n]),a[i][n]^=b[i];
        for (i=0;i<n;i++) a[i][i]=1;
        while (~scanf("%d%d",&x,&y) && x && y) a[y-1][x-1]=1;//注意,是a[y-1][x-1] 
        ans=gauss(n,n);
        if (ans==-1) puts("Oh,it's impossible~!!");
        else printf("%d\n",1<<ans);
    }
}

POJ 3185 The Water Bowls

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,i,a[21][21],ans,b[21],fi[21],x[21];
void gauss(int n,int m){
    int k,col=0,cnt=0;
    for (k=0;k<n && col<m;k++,col++){
        int mx=k;
        for (int i=k+1;i<n;i++)
            if (a[i][col]>a[mx][col]) mx=i;
        if (mx!=k)
            for (int i=col;i<=m;i++) swap(a[k][i],a[mx][i]);
        if (!a[k][col]){
            k--;fi[cnt++]=col;
            b[col]=1;
            continue;
        }
        for (int i=k+1;i<n;i++)
            if (a[i][col])
                for (int j=col;j<=m;j++) a[i][j]^=a[k][j];
    }
    for (int t=0;t<1<<cnt;t++){
        int tmp=t,num=0;memset(x,0,sizeof(x));
        for (int i=0;i<cnt;i++){
            if (tmp&1) x[fi[i]]=1,num++;
            tmp>>=1;
        }
        for (int i=k-1;i>=0;i--)
            if (!b[i]){
                int temp=a[i][m];
                for (int j=i+1;j<n;j++) temp^=a[i][j] && x[j];
                x[i]=temp;
                if (temp) num++;
            }
        ans=min(ans,num);
    }
}
int main(){
    n=20;
    for (i=0;i<n;i++){
        scanf("%d",&a[i][n]);
        a[i][i]=1;
        if (i) a[i-1][i]=1;
        if (i<n-1) a[i+1][i]=1;
    }
    ans=1e9;
    gauss(n,n);
    printf("%d",ans);
}

POJ 2947 Widget Factory

//https://www.cnblogs.com/gj-Acit/p/3903085.html
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int a[302][302],x[302],i,j,k,n,m,ans,xx,yy;
char st[5],end[5],str[7][4]={"MON","TUE","WED","THU","FRI","SAT","SUN"};
int find(char *s){
    for (int i=0;i<7;i++)
        if (!strcmp(str[i],s)) return i;
}
int lcm(int x,int y){return x/__gcd(x,y)*y;}
void ex_gcd(int a,int b,int &x,int &y){
    if (!b){
        x=1,y=0;
        return;
    }
    ex_gcd(b,a%b,y,x);
    y-=a/b*x;
}
int gauss(int n,int m){
    int k=0,col=0;
    for (;k<n && col<m;k++,col++){
        int mx=k;
        for (int i=k+1;i<n;i++)
            if (abs(a[i][col])>abs(a[mx][col])) mx=i;
        if (mx!=k)
            for (int i=col;i<=m;i++) swap(a[k][i],a[mx][i]);
        if (!a[k][col]){
            k--;
            continue;
        }
        for (int i=k+1;i<n;i++)
            if (a[i][col]){
                int LCM=lcm(abs(a[i][col]),abs(a[k][col]));
                int ta=LCM/a[i][col],tb=LCM/a[k][col];
                if (a[i][col]*a[k][col]<0) tb=-tb;
                for (int j=col;j<=m;j++) a[i][j]=((a[i][j]*ta-a[k][j]*tb)%7+7)%7;
            }
    }
    for (int i=k;i<n;i++)
        if (a[i][col]) return -1;
    if (k<m) return 1;
    for (int i=m-1;i>=0;i--){
        int tmp=a[i][m];
        for (int j=i+1;j<m;j++) tmp-=a[i][j]*x[j]%7;
        tmp=(tmp%7+7)%7;
        ex_gcd(a[i][i],7,xx,yy);
        x[i]=(tmp*xx%7+7)%7;
        if (x[i]<3) x[i]+=7;
    }
    return 0;
}
int main(){
    while (~scanf("%d%d",&m,&n) && m && n){
        memset(a,0,sizeof(a));
        for (i=0;i<n;i++){
            scanf("%d%s%s",&k,st,end);
            for (j=0;j<k;j++) scanf("%d",&xx),(a[i][xx-1]+=1)%=7;
            a[i][m]=find(end)-find(st)+1;
        }
        ans=gauss(n,m);
        if (ans==-1) puts("Inconsistent data.");
        else if (ans==1) puts("Multiple solutions.");
        else for (i=0;i<m;i++) printf("%d%c",x[i],i==m-1?'\n':' ');
    }
}

POJ 1166 The Clocks

//https://blog.csdn.net/u010885899/article/details/49781635
#include<cstdio>
#include<algorithm>
using namespace std;
int i,j,fl,a[10][10],x[10],xx,yy;
void ex_gcd(int a,int b,int &x,int &y){
    if (!b) x=1,y=0;
    else ex_gcd(b,a%b,y,x),y-=a/b*x;
}
int lcm(int x,int y){
    return x/__gcd(x,y)*y;
}
void gauss(int n,int m){
    int k=0,col=0;
    for (;k<n && col<m;k++,col++){
        int mx=k;
        for (;mx<n;mx++)//要改成这样,但不懂为什么,网上没解释
            if (abs(a[mx][col])) break;
        if (mx!=k)
            for (int i=col;i<=m;i++) swap(a[k][i],a[mx][i]);
        if (!a[k][col]){
            k--;
            continue;
        }
        for (int i=k+1;i<n;i++)
            if (a[i][col]){
                int LCM=lcm(abs(a[i][col]),abs(a[k][col]));
                int ta=LCM/a[i][col],tb=LCM/a[k][col];
                if (a[i][col]*a[k][col]<0) tb=-tb;
                for (int j=col;j<=m;j++) a[i][j]=((a[i][j]*ta-a[k][j]*tb)%4+4)%4;
            }
    }
    for (int i=m-1;i>=0;i--){
        int tmp=a[i][m];
        for (int j=i+1;j<m;j++) tmp-=a[i][j]*x[j]%4;
        ex_gcd(a[i][i],4,xx,yy);
        x[i]=(tmp*xx%4+4)%4;
    }
}
int main(){
    for (i=0;i<3;i++)
        for (j=0;j<3;j++) scanf("%d",&a[i*3+j][9]),a[i*3+j][9]=4-a[i*3+j][9];
    a[0][0]=a[1][0]=a[3][0]=a[4][0]=1;
    a[0][1]=a[1][1]=a[2][1]=1;
    a[1][2]=a[2][2]=a[4][2]=a[5][2]=1;
    a[0][3]=a[3][3]=a[6][3]=1;
    a[1][4]=a[3][4]=a[4][4]=a[5][4]=a[7][4]=1;
    a[2][5]=a[5][5]=a[8][5]=1;
    a[3][6]=a[4][6]=a[6][6]=a[7][6]=1;
    a[6][7]=a[7][7]=a[8][7]=1;
    a[4][8]=a[5][8]=a[7][8]=a[8][8]=1;
    gauss(9,9);
    for (i=0;i<9;i++)
        for (j=0;j<x[i];j++){
            if (fl) putchar(' ');
            fl=1;
            putchar(i+1+48);
        }
}

HDU 3949 XOR(线性基模板)

//线性基:https://blog.csdn.net/qaq__qaq/article/details/53812883
//题解:https://blog.csdn.net/qq_33184171/article/details/54695958
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int T,n,i,m,cnt,ca;
ll p[65],a[10002],d[65],k,ans;
void gauss(){
    for (int i=0;i<n;i++)
        for (int j=63;j>=0;j--)
            if (a[i]&(1ll<<j))
                if (d[j]) a[i]^=d[j];
                else{d[j]=a[i];break;}
    for (int i=63;i>=0;i--)
        for (int j=i-1;j>=0;j--)
            if (d[i]&(1ll<<j)) d[i]^=d[j];
    cnt=0;
    for (int i=0;i<64;i++)
        if (d[i]) p[cnt++]=d[i];
}
int main(){
    scanf("%d",&T);
    while (T--){
        printf("Case #%d:\n",++ca);
        scanf("%d",&n);
        for (i=0;i<n;i++) scanf("%lld",&a[i]);
        memset(d,0,sizeof(d));
        gauss();
        scanf("%d",&m);
        while (m--){
            scanf("%lld",&k);
            if (n!=cnt) k--;
            if (k>=(1ll<<cnt)){
                puts("-1");
                continue;
            }
            ans=0;
            for (i=0;i<cnt;i++)
                if (k&(1ll<<i)) ans^=p[i];
            printf("%lld\n",ans);
        }
    }
} 

另外还有几道题,可以去做一下,老师布置了,但太神,我放弃了
HDU 4818 RP problem
POJ 1487 Single-Player Games
hdu OJ 2449
foj1704 Turn off the light
HDU 3976 Electric resistance