高斯肖元专题

poj 1222  高斯肖元模版题

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const int maxn=30;
int a[maxn][maxn+1],x[maxn];
int equ,var,free_num;
void Debug()
{
   for(int i=0;i<equ;i++)
   {
      for(int j=0;j<var+1;j++)
        cout<<a[i][j]<<" ";
      cout<<endl;
   }     
}
int gcd(int a,int b)
{
     if(a<0) return gcd(-a,b);
     if(b<0) return gcd(a,-b);
     return b==0?a:gcd(b,a%b);
}
int Gauss()
{
    int k,col=0;
    for(k=0;k<equ&&col<var;k++,col++)
    {
        int mx=k;
        for(int i=k+1;i<equ;i++)
          if(a[i][col]>a[mx][col]) mx=i;                       
        if(mx!=k) 
           for(int i=k;i<var+1;i++)  swap(a[k][i],a[mx][i]);
        if(!a[k][col]) { k--;continue; }
        for(int i=k+1;i<equ;i++)
           if(a[i][col]!=0)
           {
               int lcm=a[k][col]/gcd(a[k][col],a[i][col])*a[i][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<var+1;j++) 
                 a[i][j]=((a[i][j]*ta)%2 - (a[k][j]*tb)%2+2)%2; 
           }
     }  
    // Debug(); 
     //cout<<col<<endl<<endl;
     for(int i=k;i<equ;i++)
        if(a[i][var]) return -1;
     for(int i=0,j;i<equ;i++)
         if(!a[i][i])
         {
              for(j=i+1;j<var;j++)
                 if(a[i][j]) break;
              if(var==j) break;
              for(int r=0;r<equ;r++) swap(a[r][i],a[r][j]);
         }
      for(int i=k-1;i>=0;i--)
      {
          int tmp=a[i][var]%2;
          for(int j=i+1;j<var;j++)
             if(a[i][j]) tmp=(tmp-a[i][j]*x[j]%2+2)%2;
          x[i]=(tmp/a[i][i])%2;
      }
}
void init()
{
     memset(a,0,sizeof(a));
     memset(x,0,sizeof(x));
     for(int i=0;i<5;i++)
     for(int j=0;j<6;j++)
      {
           if(i!=0) a[i*6+j][(i-1)*6+j]=1;
           if(i!=4) a[i*6+j][(i+1)*6+j]=1;
           if(j!=0) a[i*6+j][i*6+j-1]=1;
           if(j!=5) a[i*6+j][i*6+j+1]=1;
           a[i*6+j][i*6+j]=1;
      }     
}
int main(int argc, char *argv[])
{
    int T,ca=1;
    scanf("%d",&T);
    equ=30,var=30;
    while(T--)
    {
        init();
        for(int i=0;i<30;i++) scanf("%d",&a[i][30]);
        Gauss();
        printf("PUZZLE #%d\n",ca++);
        for(int i=0;i<30;i++)
        {
            if(i%6!=0) putchar(' ');
            printf("%d",x[i]);
            if(i%6==5) puts("");
        }
    }
    return EXIT_SUCCESS;
}


poj 1681 Painter's Problem  

   高斯肖元后,用二进制位枚举自由元,取最优值

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;
const int inf=0x3fffffff;

const int maxn=15*15;
int a[maxn][maxn+1],x[maxn],equ,var,n;
 char s[20][20];

void init()
{
    equ=var=n*n;
    for(int i=0;i<n;i++)
       scanf("%s",s[i]);
    memset(a,0,sizeof(a));
    for(int i=0;i<var;i++) a[i][var]= (s[i/n][i%n]!='y'),a[i][i]=1;
    for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)
    {
        if(i!=0) a[(i-1)*n+j][i*n+j]=1;
        if(i!=n-1) a[(i+1)*n+j][i*n+j]=1;
        if(j!=0) a[i*n+j-1][i*n+j]=1;
        if(j!=n-1) a[i*n+j+1][i*n+j]=1;
    }
}
void debug()
{
    for(int i=0;i<equ;i++)
    {
        for(int j=0;j<=var;j++)
          cout<<a[i][j]<<" ";
        cout<<endl;
    }
    cout<<endl;
}
int gcd(int a,int b)
{
    if(a<0) return gcd(-a,b);
    if(b<0) return gcd(a,-b);
    return b==0?a:gcd(b,a%b);
}

int gauss()
{
    int k,col;
    for(k=col=0;k<equ&&col<var;k++,col++)
    {
        int mx=k;
        for(int i=k+1;i<equ;i++)
           if(a[i][col]>a[mx][col]) mx=i;
        if(k!=mx){
            for(int i=k;i<var+1;i++)
               swap(a[k][i],a[mx][i]);
        }
        if(!a[k][col]){
            k--;continue;
        }
        for(int i=k+1;i<equ;i++)
        if(a[i][col])
        {
            int lcm=a[k][col]/gcd(a[k][col],a[i][col])*a[i][col];
            int ta=lcm/a[i][col],tb=lcm/a[k][col];
            for(int j=col;j<var+1;j++)
               a[i][j]=((a[i][j]*ta-a[k][j]*tb)%2+2)%2;
        }
    }
   // debug();
    for(int i=k;i<equ;i++)
      if(a[i][col]) return inf;

    for(int i=0,j;i<equ;i++)
       if(!a[i][i])
       {
           for(j=i+1;j<var;j++)
             if(a[i][j]) break;
           if(j>=var) break;
           for(int r=0;r<equ;r++) swap(a[r][i],a[r][j]);
       }

    int ret=inf,lim= (1<<(var-k));

   for(int j=0;j<lim;j++)
   {
     for(int i=0;i<(var-k);i++)
       if(j&(1<<i)) x[equ-1-i]=1;
       else x[equ-1-i]=0;
     for(int i=k-1;i>=0;i--)
     {
        int tmp=a[i][var];
        for(int j=i+1;j<var;j++)
          tmp=((tmp-a[i][j]*x[j])%2+2)%2;
        x[i]=tmp/a[i][i]%2;
     }
     int cnt=0;
     for(int i=0;i<var;i++)
        if(x[i]) cnt++;
     ret=min(cnt,ret);
     if(ret==0) break;
   }
   return ret;
}
int main()
{
    int T;

    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        init();
       // debug();
        int re=gauss();
        //cout<<re<<endl;
        if(re==inf) puts("inf");
        else printf("%d\n",re);
    }
    return 0;
}


poj 1753 Flip Game   枚举自由元,然后取最优优即可

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const int maxn=30;
const int inf=0x3fffffff;
int a[maxn][maxn+1],x[maxn];
int equ,var,free_num;
void Debug()
{
   for(int i=0;i<equ;i++)
   {
      for(int j=0;j<var+1;j++)
        cout<<a[i][j]<<" ";
      cout<<endl;
   }
}
int gcd(int a,int b)
{
     if(a<0) return gcd(-a,b);
     if(b<0) return gcd(a,-b);
     return b==0?a:gcd(b,a%b);
}
int Gauss()
{
    int k,col=0;
    for(k=0;k<equ&&col<var;k++,col++)
    {
        int mx=k;
        for(int i=k+1;i<equ;i++)
          if(a[i][col]>a[mx][col]) mx=i;
        if(mx!=k)
           for(int i=k;i<var+1;i++)  swap(a[k][i],a[mx][i]);
        if(!a[k][col]) { k--;continue; }
        for(int i=k+1;i<equ;i++)
           if(a[i][col]!=0)
           {
               int lcm=a[k][col]/gcd(a[k][col],a[i][col])*a[i][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<var+1;j++)
                 a[i][j]=((a[i][j]*ta)%2 - (a[k][j]*tb)%2+2)%2;
           }
     }
    // Debug();
     //cout<<col<<endl<<endl;
     for(int i=k;i<equ;i++)
        if(a[i][var]) return inf;
     for(int i=0,j;i<equ;i++)
         if(!a[i][i])
         {
              for(j=i+1;j<var;j++)
                 if(a[i][j]) break;
              if(var==j) break;
              for(int r=0;r<equ;r++) swap(a[r][i],a[r][j]);
         }
     int Min=inf;
     for(int j=0;j<(1<<(equ-k));j++)
     {
        int tmp=j,p=equ-1;
        while(tmp) x[p--]=tmp%2,tmp>>=1;
        for(int i=k-1;i>=0;i--)
        {
          int tmp=a[i][var]%2;
          for(int j=i+1;j<var;j++)
             if(a[i][j]) tmp=(tmp-a[i][j]*x[j]%2+2)%2;
          x[i]=(tmp/a[i][i])%2;
        }
        tmp=0;
        for(int i=0;i<16;i++) tmp+=x[i];
        Min=min(Min,tmp);
     }
     return Min;
}
char s[10][10];
int init(int id)
{
     memset(a,0,sizeof(a));
     memset(x,0,sizeof(x));
     for(int i=0;i<4;i++)
     for(int j=0;j<4;j++)
      {
           if(i!=0) a[i*4+j][(i-1)*4+j]=1;
           if(i!=3) a[i*4+j][(i+1)*4+j]=1;
           if(j!=0) a[i*4+j][i*4+j-1]=1;
           if(j!=3) a[i*4+j][i*4+j+1]=1;
           a[i*4+j][i*4+j]=1;
      }
    if(!id){
      if(scanf("%s",s[0])==-1) return 0;
      for(int i=1;i<4;i++) scanf("%s",s[i]);
    }
     for(int i=0;i<4;i++)
     for(int j=0;j<4;j++)
        a[i*4+j][16]=id^(s[i][j]=='w');
     return 1;
}
int main()
{
    equ=16,var=16;
    while(init(0))
    {
        //Debug();
        int ans=Gauss();
        init(1);
        ans=min(ans,Gauss());
        if(ans!=inf) printf("%d\n",ans);
        else printf("Impossible\n");
    }
    return EXIT_SUCCESS;
}


poj 3185 The Water Bowls

和上面几乎一样的题目

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int maxn=20;
const int inf=0x3fffffff;
int a[maxn][maxn+1],x[maxn],equ,var;

int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}
void debug()
{
    for(int i=0;i<equ;i++)
    {
        for(int j=0;j<var+1;j++)
          cout<<a[i][j]<<" ";
        cout<<endl;
    }
    cout<<endl;
}
int gauss()
{
    int k,col;
    for(k=col=0;k<equ&&col<var;k++,col++)
    {
        int mx=k;
        for(int i=k+1;i<equ;i++)
           if(a[i][col]>a[mx][col]) mx=i;
        if(k!=mx){
            for(int i=k;i<var+1;i++)
               swap(a[k][i],a[mx][i]);
        }
        if(!a[k][col]){
            k--;continue;
        }
        for(int i=k+1;i<equ;i++)
        if(a[i][col])
        {
            int lcm=a[k][col]/gcd(a[k][col],a[i][col])*a[i][col];
            int ta=lcm/a[i][col],tb=lcm/a[k][col];
            for(int j=col;j<var+1;j++)
               a[i][j]=((a[i][j]*ta-a[k][j]*tb)%2+2)%2;
        }
    }
   // debug();
    for(int i=k;i<equ;i++)
      if(a[i][col]) return -1;
    for(int i=0,j;i<equ;i++)
      if(!a[i][i])
      {
          for(j=i+1;j<var;j++)
            if(a[i][j]) break;
          if(j>=var) break;
          for(int r=0;r<equ;r++)
            swap(a[r][i],a[r][j]);
      }
     int ret=inf,lim= (1<<(var-k));

   for(int j=0;j<lim;j++)
   {
     for(int i=0;i<(var-k);i++)
       if(j&(1<<i)) x[equ-1-i]=1;
       else x[equ-1-i]=0;
     for(int i=k-1;i>=0;i--)
     {
        int tmp=a[i][var];
        for(int j=i+1;j<var;j++)
          tmp=((tmp-a[i][j]*x[j])%2+2)%2;
        x[i]=tmp/a[i][i]%2;
     }
     int cnt=0;
     for(int i=0;i<var;i++)
        if(x[i]) cnt++;
     ret=min(cnt,ret);
     if(ret==0) break;
   }
   return ret;
}

int main()
{
    var=equ=20;
    int tmp;
    while(scanf("%d",&tmp)==1)
    {
        memset(a,0,sizeof(a));
        a[0][var]=tmp;
        for(int i=1;i<equ;i++) scanf("%d",&a[i][var]);
        //debug();
        for(int i=0;i<var;i++)
        {
            if(i!=0) a[i-1][i]=1;
            if(i!=var-1) a[i+1][i]=1;
            a[i][i]=1;
        }
        //debug();
        printf("%d\n",gauss());
    }
    return 0;
}


poj 2947 Widget Factory

这个题目比前两个就难很多了,不同的是方程的数量 !=  变量的数量  ,而且也不是对2 取模了,而是对7取模……要用到扩展欧几里得

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const int maxn=300;
int a[maxn][maxn+1],x[maxn];
int equ,var,free_num;
void Debug()
{
   for(int i=0;i<equ;i++)
   {
      for(int j=0;j<var+1;j++)
        cout<<a[i][j]<<" ";
      cout<<endl;
   }
}
int gcd(int a,int b)
{
    if(a<0) return gcd(-a,b);
    if(b<0) return gcd(a,-b);
    return b==0?a:gcd(b,a%b);
}
int change(char *s){
    if(strcmp(s,"MON")==0)
        return 1;
    else if(strcmp(s,"TUE")==0)
        return 2;
    else if(strcmp(s,"WED")==0)
        return 3;
    else if(strcmp(s,"THU")==0)
        return 4;
    else if(strcmp(s,"FRI")==0)
        return 5;
    else if(strcmp(s,"SAT")==0)
        return 6;
    else return 7;
}
int ex_gcd(int a,int b,int &x,int &y)
{
    if(b==0){
         x=1,y=0;
         return a;
    }
    int ret=ex_gcd(b,a%b,x,y);
    int tmp=x;
    x=y;
    y=tmp-a/b*y;
    return ret;
}
void gauss()
{
    int k,col=0;
    for(k=0;k<equ&&col<var;k++,col++)
    {
        int mx=k;
        for(int i=k+1;i<equ;i++)
          if(a[i][col]>a[mx][col]) mx=i;
        if(mx!=k)
           for(int i=k;i<var+1;i++)  swap(a[k][i],a[mx][i]);
        if(!a[k][col]) { k--;continue; }
        for(int i=k+1;i<equ;i++)
           if(a[i][col]!=0)
           {
               int lcm=a[k][col]/gcd(a[k][col],a[i][col])*a[i][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<var+1;j++)
                 a[i][j]=((a[i][j]*ta)%7 - (a[k][j]*tb)%7+7)%7;
           }
     }

    for(int i=k;i<equ;i++)
       if(a[i][col]!=0) {
           puts("Inconsistent data.");
           return;
       }
    if(k<var){
        printf("Multiple solutions.\n");
        return;
    }
    for(int i=0,j;i<equ;i++)
       if(a[i][i]==0){
           for(j=i+1;j<var;j++)
              if(a[i][j]) break;
           if(j>=var) break;
           for(int r=0;r<equ;r++) swap(a[r][i],a[r][j]);
       }
    for(int i=k-1;i>=0;i--)
    {
        int tmp=a[i][var]%7,x1,y;
        for(int j=i+1;j<var;j++)
           if(a[i][j]) tmp=((tmp-x[j]*a[i][j])%7+7)%7;
        int gcd=ex_gcd(a[i][i],7,x1,y);
        x[i]=(x1*tmp/gcd%7+7)%7;
    }
    for(int i=0;i<var;i++)
       if(x[i]<3) x[i]+=7;
    printf("%d",x[0]);
    for(int i=1;i<var;i++)
      printf(" %d",x[i]);
    puts("");
}
int main()
{
    int p,d;
    char s1[10],s2[10];
    while(scanf("%d%d",&var,&equ),(var||equ))
    {
        memset(a,0,sizeof(a));
        memset(x,0,sizeof(x));
        for(int i=0;i<equ;i++)
        {
             scanf("%d%s%s",&p,s1,s2);
             a[i][var]=((change(s2)-change(s1))%7+8)%7;
             for(int j=0;j<p;j++){
                scanf("%d",&d);
                a[i][d-1]++;
                a[i][d-1]%=7;
             }
        }
        gauss();
    }
    return 0;
}


poj 2065 SETI


感觉这个题目,理解题意要比做题难…… 其实就是很裸地求模高斯消元模版题

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;
const int maxn=70;
int mod,a[maxn][maxn+1],x[maxn],equ,var;
 char s[100];

void init()
{
    equ=strlen(s);
    var=equ;
    for(int i=0;i<var;i++)
    {
        int tmp=1;
        for(int j=0;j<var;j++)
        {
           a[i][j]=tmp;
           tmp=tmp*(i+1)%mod;
        }
        a[i][var]= (s[i]=='*')?0:(s[i]-'a'+1);
    }
}
void debug()
{
    for(int i=0;i<equ;i++)
    {
        for(int j=0;j<=var;j++)
          cout<<a[i][j]<<" ";
        cout<<endl;
    }
    cout<<endl;
}
int gcd(int a,int b)
{
    if(a<0) return gcd(-a,b);
    if(b<0) return gcd(a,-b);
    return b==0?a:gcd(b,a%b);
}
int ex_gcd(int a,int b,int &x,int &y)
{
    if(b==0){
         x=1,y=0;
         return a;
    }
    int ret=ex_gcd(b,a%b,x,y);
    int tmp=x;
    x=y;
    y=tmp-a/b*y;
    return ret;
}
void gauss()
{
    int k,col;
    for(k=col=0;k<equ&&col<var;k++,col++)
    {
        int mx=k;
        for(int i=k+1;i<equ;i++)
           if(a[i][col]>a[mx][col]) mx=col;
        if(k!=col){
            for(int i=k;i<var+1;i++)
               swap(a[k][i],a[mx][i]);
        }
        if(!a[k][col]){
            k--;continue;
        }
        for(int i=k+1;i<equ;i++)
        if(a[i][col])
        {
            int lcm=a[k][col]/gcd(a[k][col],a[i][col])*a[i][col];
            int ta=lcm/a[i][col],tb=lcm/a[k][col];
            for(int j=col;j<var+1;j++)
               a[i][j]=((a[i][j]*ta-a[k][j]*tb)%mod+mod)%mod;
        }
    }
    for(int i=k;i<equ;i++)
      if(a[i][col]) return;

    for(int i=0,j;i<equ;i++)
       if(!a[i][i])
       {
           for(j=i+1;j<var;j++)
             if(a[i][j]) break;
           if(j>=var) break;
           for(int r=0;r<equ;r++) swap(a[r][i],a[r][j]);
       }

   // debug();
    for(int i=k-1;i>=0;i--)
    {
        int tmp=a[i][var],x1,y1;
        for(int j=i+1;j<var;j++)
          tmp=((tmp-a[i][j]*x[j])%mod+mod)%mod;
        int gcd=ex_gcd(a[i][i],mod,x1,y1);
        x[i]=(x1*tmp/gcd%mod+mod)%mod;
    }
    printf("%d",x[0]);
    for(int i=1;i<var;i++) printf(" %d",x[i]);
    puts("");
}
int main()
{
    int T;

    scanf("%d",&T);
    while(T--)
    {
        scanf("%d %s",&mod,s);
        init();
      //  debug();
        gauss();
    }
    return 0;
}


poj 1830 开关问题

思路: 每个开关都有动和不动两个选择,所以可以用1 来表示动 ,0表示不动

假如三个开关, 然后用一组向量来表示最终结果Li 表示第i个开关最终是否动了,即向量组 ( L1, L2, L3)

用(x1,x2,x3)来表示最终是动还是不动,那么就有

a11*x1 + a12*x2 +a13*x3 = L1 mod  2

a21*x1 + a22*x2 +a23*x3 = L2 mod  2

a31*x1 + a32*x2 +a33*x3 = L3 mod  2

如果 i 灯能是j 灯亮 ,那么a[j][i ] ==1 ,为什么其实仔细想想就明白了


#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int maxn=29;
int a[maxn][maxn+1],equ,var,x[maxn],pre[maxn];
void debug()
{
    for(int i=0;i<equ;i++)
    {
        for(int j=0;j<var+1;j++)
          cout<<a[i][j]<<" ";
        cout<<endl;
    }
}
int gcd(int a,int b)
{
    if(a<0) return gcd(-a,b);
    if(b<0) return gcd(a,-b);
    return b==0?a:gcd(b,a%b);
}
void gauss()
{
    int k,col;
    for(k=col=0;k<equ&&col<var;k++,col++)
    {
        int mx=k;
        for(int i=k+1;i<equ;i++)
           if(a[i][col]>a[k][col]) mx=i;
        //cout<<mx<<endl;
        if(mx!=k){
           for(int i=k;i<var+1;i++) swap(a[k][i],a[mx][i]);
        }
        if(!a[k][col]){
           k--;continue;
        }
        for(int i=k+1;i<equ;i++)
        if(a[i][col])
        {
            int lcm=a[i][col]/gcd(a[i][col],a[k][col])*a[k][col];
            int ta=lcm/a[i][col],tb=lcm/a[k][col];
            for(int j=col;j<var+1;j++)
              a[i][j]=((a[i][j]*ta-a[k][j]*tb)%2+2)%2;
        }
    }
 //   debug();
 //   cout<<endl;
    for(int i=k;i<equ;i++)
      if(a[i][col]){
         puts("Oh,it's impossible~!!");
         return;
      }
    printf("%d\n",1<<(var-k));
}
int main()
{
    int T,tmp,t2,t1;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&equ);var=equ;
        for(int i=0;i<var;i++)  scanf("%d",&pre[i]);
        memset(a,0,sizeof(a));
        for(int i=0;i<var;i++)
        {
            scanf("%d",&tmp);
            a[i][var]=pre[i]^tmp;
            a[i][i]=1;
        }
        while(scanf("%d%d",&t1,&t2),(t1||t2)) a[t2-1][t1-1]=1;
        gauss();
    }
    return 0;
}

hdu 3364  Lanterns


这个题目跟上个题目类似,不过要注意的是答案可能超int,然后就是初始化举证 a 在经过一次高斯肖元后要改动,所以要存起来,然后再高斯肖元前赋值给a,在这点wa了几次,还是看了别人的题解报告才发现的,泪……

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int maxn=50;
int a[maxn][maxn+1],equ,var,x[maxn],pre[maxn],b[maxn][maxn+1];
void debug()
{
    for(int i=0;i<equ;i++)
    {
        for(int j=0;j<var+1;j++)
          cout<<a[i][j]<<" ";
        cout<<endl;
    }
    cout<<endl;
}
int abs(int a)
{
    return a<0?-a:a;
}
int gcd(int a,int b)
{
    if(a<0) return gcd(-a,b);
    if(b<0) return gcd(a,-b);
    return b==0?a:gcd(b,a%b);
}
void gauss()
{
    int k,col;
    for(k=col=0;k<equ&&col<var;k++,col++)
    {
        int mx=k;
        for(int i=k+1;i<equ;i++)
           if(a[i][col]>a[k][col]) mx=i;
        if(mx!=k){
           for(int i=k;i<var+1;i++) swap(a[k][i],a[mx][i]);
        }
        if(!a[k][col]){
           k--;continue;
        }
        for(int i=k+1;i<equ;i++)
        if(a[i][col])
        {
            int lcm=a[i][col]/gcd(a[i][col],a[k][col])*a[k][col];
            int ta=lcm/a[i][col],tb=lcm/a[k][col];
            for(int j=col;j<var+1;j++)
              a[i][j]=((a[i][j]*ta-a[k][j]*tb)%2+2)%2;
        }
    }
    //debug();
    for(int i=k;i<equ;i++)
      if(a[i][col]){
         puts("0");
         return;
    }
    printf("%I64d\n",1LL<<(var-k));
}
int main()
{
    int T,tmp,t2,t1,k,ca=1;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&equ,&var);
        memset(b,0,sizeof(b));
        for(int i=0;i<var;i++)
        {
            scanf("%d",&k);
            for(int j=0;j<k;j++)
               scanf("%d",&tmp),b[tmp-1][i]=1;
        }
        scanf("%d",&k);
        printf("Case %d:\n",ca++);
        while(k--)
        {
            memcpy(a,b,sizeof(b));
            for(int i=0;i<equ;i++) scanf("%d",&a[i][var]);
            gauss();
        }
    }
    return 0;
}


hdu 4200 Bad wiring

高斯肖元典型的题目,枚举自由变量

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int maxn=100;
int a[maxn][maxn+1],equ,var,x[maxn],pre[maxn];
void debug()
{
    for(int i=0;i<equ;i++)
    {
        for(int j=0;j<var+1;j++)
          cout<<a[i][j]<<" ";
        cout<<endl;
    }
    cout<<endl;
}
int abs(int a)
{
    return a<0?-a:a;
}
int gcd(int a,int b)
{
    if(a<0) return gcd(-a,b);
    if(b<0) return gcd(a,-b);
    return b==0?a:gcd(b,a%b);
}
void gauss()
{
    int k,col;
    for(k=col=0;k<equ&&col<var;k++,col++)
    {
        int mx=k;
        for(int i=k+1;i<equ;i++)
           if(a[i][col]>a[k][col]) mx=i;
        if(mx!=k){
           for(int i=k;i<var+1;i++) swap(a[k][i],a[mx][i]);
        }
        if(!a[k][col]){
           k--;continue;
        }
        for(int i=k+1;i<equ;i++)
        if(a[i][col])
        {
            int lcm=a[i][col]/gcd(a[i][col],a[k][col])*a[k][col];
            int ta=lcm/a[i][col],tb=lcm/a[k][col];
            for(int j=col;j<var+1;j++)
              a[i][j]=((a[i][j]*ta-a[k][j]*tb)%2+2)%2;
        }
    }
    //debug();
    for(int i=k;i<equ;i++)
      if(a[i][col]){
         puts("impossible");
         return;
    }
    for(int i=0,j;i<equ;i++)
       if(a[i][i]==0){
           for(j=i+1;j<var;j++)
              if(a[i][j]) break;
           if(j>=var) break;
           for(int r=0;r<equ;r++) swap(a[r][i],a[r][j]);
    }
   memset(x,0,sizeof(x));
   int Min=99999999;
   for(int j=0;j<(1<<(equ-k));j++)
     {
        int tmp=j,p=equ-1;
        while(tmp) x[p--]=tmp%2,tmp>>=1;
        for(int i=k-1;i>=0;i--)
        {
          int tmp=a[i][var]%2;
          for(int j=i+1;j<var;j++)
             if(a[i][j]) tmp=(tmp-a[i][j]*x[j]%2+2)%2;
          x[i]=(tmp/a[i][i])%2;
        }
        tmp=0;
        for(int i=0;i<var;i++) tmp+=x[i];
        Min=min(Min,tmp);
     }
   printf("%d\n",Min);
}
int main()
{
    int T,tmp,t2,t1,k,ca=1,d;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&equ,&d);
        var=equ;
        memset(a,0,sizeof(a));
        for(int i=0;i<var;i++)
            scanf("%d",&a[i][var]);
        for(int i=0;i<var;i++)
        {
            for(int j=0;j<=d;j++)
            {
              if(i-j>=0) a[i-j][i]=1;
              if(i+j<var) a[i+j][i]=1;
            }
        }
       // debug();
        gauss();
    }
    return 0;
}

这个是完整源码 python实现 Django 【python毕业设计】基于Python的天气预报(天气预测分析)(Django+sklearn机器学习+selenium爬虫)可视化系统.zip 源码+论文+sql脚本 完整版 数据库是mysql 本研究旨在开发一个基于Python的天气预报可视化系统,该系统结合了Django框架、sklearn机器学习库和Selenium爬虫技术,实现对天气数据的收集、分析和可视化。首先,我们使用Selenium爬虫技术从多个天气数据网站实时抓取气象数据,包括温度、湿度、气压、风速等多项指标。这些数据经过清洗和预处理后本研究旨在开发一个基于Python的天气预报可视化系统,该系统结合了Django框架、sklearn机器学习库和Selenium爬虫技术,实现对天气数据的收集、分析和可视化。首先,我们使用Selenium爬虫技术从多个天气数据网站实时抓取气象数据,包括温度、湿度、气压、风速等多项指标。这些数据经过清洗和预处理后,将其存储在后端数据库中,以供后续分析。 其次,采用s,将其存储在后端数据库中,以供后续分析。 其次,采用sklearn机器学习库构建预测模型,通过时间序列分析和回归方法,对未来天气情况进行预测。我们利用以往的数据训练模型,以提高预测的准确性。通过交叉验证和超参数优化等技术手段,我们优化了模型性能,确保其在实际应用中的有效性和可靠性。 最后,基于Django框架开发前端展示系统,实现天气预报的可视化。用户可以通过友好的界面查询实时天气信息和未来几天内的天气预测。系统还提供多种图表类型,包括折线图和柱状图,帮助用户直观理解天气变化趋势。 本研究的成果为天气预报领域提供了一种新的技术解决方案,不仅增强了数据获取和处理的效率,还提升了用户体验。未来,该系统能够扩展至其他气象相关的应用场景,为大众提供更加准确和及时的气象服务。
【多线路故障】含sop的配电网故障重构研究(Matlab代码实现)内容概要:本文围绕“含SOP的配电网故障重构研究”展开,重点探讨了在多线路故障情况下,利用柔性开断点(SOP)进行配电网故障重构的优化方法,并提供了基于Matlab的代码实现方案。研究内容包括SOP在主动配电网中的电压与无功协调控制、多时段配网优化模型构建、以及基于灵敏度分析的SOP优化配置等关键技术,旨在提升配电网在复杂故障条件下的恢复能力与运行效率。文中还提到了Simulink仿真模型的应用,如三端口SOP、软连接开关、SNOP等装置的建模与仿真,增强了研究的技术落地性。; 适合人群:具备电力系统基础知识,熟悉Matlab/Simulink仿真工具,从事配电网优化、智能电网、柔性互联装置等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于科研学习中理解SOP在配电网故障重构中的作用机制;②支撑论文复现与算法改进,特别是在多线路故障场景下的网络重构与优化调度;③为实际配电网系统中引入SOP设备提供仿真验证与策略设计依据; 阅读建议:建议结合提供的Matlab代码与Simulink模型进行实践操作,重点关注SOP控制策略、故障重构算法的设计逻辑与参数设置,同时参考文中提及的YALMIP工具包进行优化求解,以加深对模型构建与求解过程的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值