p2700_xor线性方程组.cpp

来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· C++ 代码 · 共 72 行

CPP
72
字号
#include <stdio.h>
#include <string.h>

#define n 400
#define m 130

struct TPol {
       int  s [m + 10];
       int& operator [] ( const int Index ) { return s [Index]; }
       int  operator [] ( const int Index ) const { return s [Index]; }
       bool init ();
       void print ();
};

TPol   a , b , c , A [n] , x;
int    Pos [n] , Num [n];

bool   solve ();

main ()
{
     while ( a.init () && b.init () && c.init () ) {
           if ( !solve () ) printf ( "no solution\n" );
           printf ( "\n" );
     }
}

bool solve ()
{
     memset ( A , 0 , sizeof ( A ));
     for ( int i = 0; i < m; i ++ )
         for ( int j = 0; j < m; j ++ )
             A [i + j + j] [j] ^= a [i] ,
             A [i + j] [j] ^= b [i];
     for ( int i = 0; i < m; i ++ ) A [i] [m] = c [i];
     
     int t = 0 , i , j , k;
     for ( int i = 0; i < n; i ++ ) {
         for ( j = 0; j <= m; j ++ ) if ( A [i] [j] ) break;
         if ( j == m ) return false;
         if ( j > m ) continue;
         
         for ( k = 0; k < n; k ++ ) if ( k != i && A [k] [j] )
             for ( int p = 0; p <= m; p ++ ) A [k] [p] ^= A [i] [p];
         Num [t] = i , Pos [t ++] = j;
     }
     memset ( x.s , 0 , sizeof ( x.s ));
     for ( int i = 0; i < t; i ++ )
         x [Pos [i]] = A [Num [i]] [m];
     x.print ();
     return true;
}

bool TPol :: init ()
{
     int len;
     if ( scanf ( "%d" , &len ) != 1 ) return false;
     memset ( s , 0 , sizeof ( s ));
     for ( int i = len; i >= 0; i -- )
         scanf ( "%d" , &s [i] );
     return true;
}

void TPol :: print ()
{
     int  i;
     for ( i = m - 1; i >= 0; i -- ) if ( s [i] ) break;
     for ( printf ( "%d " , i ); i >= 0; i -- ) printf ( " %d" , s [i] );
     printf ( "\n" );
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?