栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

zoj 2707 Equations System

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

zoj 2707 Equations System

#include<iostream>#include<sstream>#include<vector>#include<list>#include<deque>#include<queue>#include<stack>#include<map>#include<set>#include<bitset>#include<algorithm>#include<cstdio>#include<cstdlib>#include<cstring>#include<cctype>#include<cmath>#include<ctime>using namespace std;const double eps(1e-8);typedef long long lint;#define clr(x) memset( x , 0 , sizeof(x) )#define sz(v) ((int)(v).size())#define rep(i, n) for (int i = 0; i < (n); ++i)#define repf(i, a, b) for (int i = (a); i <= (b); ++i)#define repd(i, a, b) for (int i = (a); i >= (b); --i)#define clrs( x , y ) memset( x , y , sizeof(x) )int flag ;struct poly{ int a[300] ; int l ; void clear() { clr(a) ; l = 1 ; } bool zero() { if ( l == 1 && a[1] == 0 ) return true ; return false ; } bool operator == ( const poly & q ) const { if ( l != q.l ) return false ; repf( i , 1 , l ) if ( a[i] != q.a[i] ) return false ; return true ; } poly operator + ( const poly & q ) const { poly ret ; ret.clear() ; ret.l = max( l , q.l ) ; repf( i , 1 , ret.l )  ret.a[i] = q.a[i] ^ a[i] ; int tmp = ret.l ; ret.l = 1 ; repd( i , tmp , 1 ) { if ( ret.a[i] != 0 ) { ret.l = i ; break ; } } return ret ; }  poly operator - ( const poly & q ) const { poly ret ; ret.clear() ; ret.l = max( l , q.l ) ; repf( i , 1 , ret.l )  ret.a[i] = q.a[i] ^ a[i] ; int tmp = ret.l ; ret.l = 1 ; repd( i , tmp , 1 ) { if ( ret.a[i] != 0 ) { ret.l = i ; break ; } } return ret ; } poly operator * ( const poly & q ) const { poly ret ; ret.clear() ; repf( i , 1 , l ) repf( j , 1 , q.l )  ret.a[i+j-1] ^= a[i] * q.a[j] ; repd( i , q.l + l , 1 ) if ( ret.a[i] != 0 ) { ret.l = i ; break ; } return ret ; } poly operator / ( const poly & q ) const { poly ret ; ret.clear() ; poly now ; now.clear() ; ret.l = l ; repf( i , 1 , l )  ret.a[i] = a[i] ; flag = false ; if ( l == 1 && q.a[1] == 0 ) {  ret.clear() ; return ret ; } if ( ret.l < q.l ) { flag = true ; ret.clear() ;  return ret ; } repd( i , l - q.l + 1 , 1 ) { if ( ret.a[i+q.l-1] == 1 ) { now.a[i] = 1 ; repd( j , i + q.l - 1 , i )  ret.a[j] ^= q.a[j-i+1] ; } } repd( i , l , 1 ) { if ( now.a[i] != 0 ) { now.l = i ; break ; } } repf( i , 1 , q.l - 1 )  if ( ret.a[i] != 0 ) { flag = true ; } return now ; } int readin() { clr(a) ; if ( scanf("%d" , &l) != 1 ) return 0 ; l ++ ; repd( i , l , 1 ) scanf("%d" , &a[i] ) ;if ( l == 0 ) l = 1 ; return 1 ; } void show() { if ( l == 1 && a[1] == 0 ) puts("-1") ; else { printf("%d" , l - 1 ) ; repd( i , l , 1 ) { printf(" %d" , a[i] ) ; } puts("") ; } }};poly a[2] , b[2] , c[2] ;poly ansx , ansy ;poly extgcd( poly a , poly b , poly &x , poly &y ) { if ( b.zero() ) { x.clear() ; x.a[1] = 1 ; y.clear() ; return a ; } poly ret = extgcd( b , a - ( a / b ) * b , x , y ) ; poly t = x ; x = y ; y = t - (a / b) * y ; return ret ;}bool dopoly( poly a , poly b , poly c ) { poly x , y ; poly gcd = extgcd( a , b , x , y ) ; poly c1 = c / gcd ; if ( flag ) return false ; ansx = x * c1 ; ansy = y * c1 ; return true ;}bool solve() {  if ( a[0].zero() && b[0].zero() && !c[0].zero() ) return false ; if ( a[1].zero() && b[1].zero() && !c[1].zero() ) return false ;  if ( a[0].zero() && b[0].zero() && c[0].zero() && a[1].zero() && b[1].zero() && c[1].zero() ) return true ; if ( a[0].zero() && b[0].zero() && c[0].zero() ) return dopoly( a[1] , b[1] , c[1] ) ; else if ( a[1].zero() && b[1].zero() && c[1].zero() ) return dopoly( a[0] , b[0] , c[0] ) ;  poly D = a[0]*b[1] - a[1]*b[0] ; if ( !D.zero() ) { //ansx = c[0] * a[1] - c[1] * a[0]; ansy = ( c[0]*a[1] - c[1]*a[0] ) / ( a[1]*b[0]-a[0]*b[1]) ; if ( flag ) return false ; ansx = ( c[0]*b[1] - c[1]*b[0] ) / ( a[1]*b[0]-a[0]*b[1]) ; if ( flag ) return false ; } else { if ( !(c[0]*a[1] - c[1]*a[0]).zero() ) return false ; if ( !(c[0]*b[1] - c[1]*b[0]).zero() ) return false ; bool bj = false ; if ( a[0].zero() ) { bj = true ; ansy = c[0] / b[0] ; if (flag ) return false ; } if ( b[0].zero() ) { bj = true ; ansx = c[0] / a[0] ; if ( flag ) return false ; }  if ( a[1].zero() ) { bj = true ; ansx = c[1] / b[1] ; if ( flag ) return false ; }  if ( b[1].zero() ) { bj = true ; ansx = c[1] / a[1] ; if ( flag ) return false ; } if ( !bj ) return dopoly(a[0],b[0],c[0]) ; } return true ;}int main(){ while ( a[0].readin() ) { b[0].readin() ; c[0].readin() ; a[1].readin() ; b[1].readin() ; c[1].readin() ; if ( !solve() )  puts("No solution") ; else { ansx.show() ; ansy.show() ; } puts("") ; }}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/380613.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号