题目链接:https://vjudge.net/problem/FZU-1704

题意:经典开关问题,求使得灯全0的方案数。

思路:题目保证至少存在一种方案,即方程组一定有解,那么套上高斯消元法的板子,求出自由变元的个数t,方案总数即2t,t可能大于64,要用到高精度计算。

AC代码:

#include<iostream>
#include<string>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std; int compare(string str1,string str2){
int len1=str1.length(),len2=str2.length();
if(len1<len2)
return -;
else if(len1>len2)
return ;
else
return str1.compare(str2);
} //高精度加法,只能是两个正数相加
string add(string str1,string str2){
string str;
int len1=str1.length(),len2=str2.length();
if(len1<len2)
for(int i=;i<=len2-len1;i++)
str1=""+str1;
else
for(int i=;i<=len1-len2;i++)
str2=""+str2;
int cf=,tmp;
len1=str1.length();
for(int i=len1-;i>=;i--){
tmp=str1[i]-''+str2[i]-''+cf;
cf=tmp/;
tmp%=;
str=char(tmp+'')+str;
}
if(cf)
str=""+str;
return str;
} //高精度减法,只能是两个正数相减,而且要大减小
string sub(string str1,string str2){
string str;
int len1=str1.length(),len2=str2.length();
for(int i=;i<=len1-len2;i++)
str2=""+str2;
int cf=;
for(int i=len1-;i>=;i--){
if(str1[i]-cf>=str2[i]){
str=char(str1[i]-cf-str2[i]+'')+str;
cf=;
}
else{
str=char(str1[i]-cf-str2[i]++'')+str;
cf=;
}
}
str.erase(,str.find_first_not_of(''));
if(str.empty())
str="";
return str;
}
//高精度乘法,只能是两个正数相乘
string mul(string str1,string str2){
string str;
int len1=str1.length(),len2=str2.length();
for(int i=len2-;i>=;i--){
string tmpstr;
int tmp=str2[i]-'',cf=,t;
if(tmp){
for(int j=;j<=len2--i;j++)
tmpstr+="";
for(int j=len1-;j>=;j--){
t=(tmp*(str1[j]-'')+cf)%;
cf=(tmp*(str1[j]-'')+cf)/;
tmpstr=char(t+'')+tmpstr;
}
if(cf)
tmpstr=char(cf+'')+tmpstr;
}
str=add(str,tmpstr);
}
str.erase(,str.find_first_not_of('')); //删除前面多余的0,因为如果是0×10,结果将会是00
if(str.empty())
str="";
return str;
}
//高精度除法,只能是两个正数相除
void div(string str1,string str2,string& con,string &rem){
if(str2=="")
return;
else if(str1==""){
con="",rem="";
return;
}
else if(compare(str1,str2)<){
con="",rem=str1;
return;
}
else if(compare(str1,str2)==){
con="",rem="";
return;
}
else{
int len1=str1.length(),len2=str2.length();
string tmpstr;
for(int i=;i<len2-;i++)
tmpstr=tmpstr+str1[i];
for(int i=len2-;i<len1;i++){
tmpstr=tmpstr+str1[i];
tmpstr.erase(,tmpstr.find_first_not_of(''));
if(tmpstr.empty())
tmpstr="";
for(char j='';j>='';j--){
string str,tmp;
str=str+j;
tmp=mul(str,str2);
if(compare(tmp,tmpstr)<=){
con=con+j;
tmpstr=sub(tmpstr,tmp);
break;
}
}
}
rem=tmpstr;
}
con.erase(,con.find_first_not_of(''));
if(con.empty())
con="";
} bool JudgeZero(string s1){
for(int i=;i<s1.length();++i)
if(s1[i]!='') return false;
return true;
} string gcd(string a,string b){
if(!JudgeZero(b)){
string s1,s2;
div(a,b,s1,s2);
return gcd(b,s2);
}
return a;
} string lcm(string a,string b){
string t=gcd(a,b),s1,s2;
a=mul(a,b);
div(a,t,s1,s2);
return s1;
}
const int maxn=;
int T,equ,var,a[maxn][maxn],x[maxn]; int Gauss(){
int k=,max_r;
for(int col=;k<equ&&col<var;++k,++col){
max_r=k;
for(int i=k+;i<equ;++i){
if(abs(a[i][col])>abs(a[max_r][col]))
max_r=i;
}
if(max_r!=k){
for(int i=col;i<var+;++i)
swap(a[max_r][i],a[k][i]);
}
if(!a[k][col]){
--k;
continue;
}
for(int i=k+;i<equ;++i){
if(!a[i][col]) continue;
for(int j=col;j<var+;++j)
a[i][j]^=a[k][j];
}
}
for(int i=k;i<equ;++i)
if(a[i][var])
return -;
return var-k;
} int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d",&equ,&var);
for(int i=;i<equ;++i)
for(int j=;j<var+;++j)
a[i][j]=;
for(int i=;i<var+;++i)
x[i]=;
for(int i=;i<equ;++i)
scanf("%d",&a[i][var]);
for(int i=;i<var;++i){
int t1,t2;
scanf("%d",&t1);
while(t1--){
scanf("%d",&t2);
--t2;
a[t2][i]=;
}
}
int t=Gauss();
string s1,s2;
s1=s1+"",s2=s2+"";
while(t--)
s1=mul(s1,s2);
cout<<s1<<endl;
}
return ;
}

fzu1704(高斯消元法解异或方程组+高精度输出)的更多相关文章

  1. bzoj千题计划105:bzoj3503: [Cqoi2014]和谐矩阵(高斯消元法解异或方程组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3503 b[i][j] 表示i对j是否有影响 高斯消元解异或方程组 bitset优化 #include ...

  2. poj1222(高斯消元法解异或方程组+开关问题)

    题目链接:https://vjudge.net/problem/POJ-1222 题意:给定一个5×6的01矩阵,改变一个点的状态时它上下左右包括它自己的状态都会翻转,因为翻转2次等价与没有翻转,那么 ...

  3. bzoj千题计划187:bzoj1770: [Usaco2009 Nov]lights 燈 (高斯消元解异或方程组+枚举自由元)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1770 a[i][j] 表示i对j有影响 高斯消元解异或方程组 然后dfs枚举自由元确定最优解 #in ...

  4. 【BZOJ】2466: [中山市选2009]树 高斯消元解异或方程组

    [题意]给定一棵树的灯,按一次x改变与x距离<=1的点的状态,求全0到全1的最少次数.n<=100. [算法]高斯消元解异或方程组 [题解]设f[i]=0/1表示是否按第i个点的按钮,根据 ...

  5. Bzoj3517 翻硬币题解 解异或方程组

    3517: 翻硬币 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 281  Solved: 211[Submit][Status][Discuss] D ...

  6. 高斯消元法求解异或方程组: cojs.tk 539.//BZOJ 1770 牛棚的灯

    高斯消元求解异或方程组: 比较不错的一篇文章:http://blog.sina.com.cn/s/blog_51cea4040100g7hl.html cojs.tk  539. 牛棚的灯 ★★☆   ...

  7. POJ 1222 EXTENDED LIGHTS OUT(高斯消元解异或方程组)

    EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 10835   Accepted: 6 ...

  8. bzoj千题计划188:bzoj1923: [Sdoi2010]外星千足虫 (高斯—若尔当消元法解异或方程组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1923 #include<cstdio> #include<cstring> ...

  9. 高斯—若尔当(约当)消元法解异或方程组+bitset优化模板

    高斯消元法是将矩阵化为上三角矩阵 高斯—若尔当消元法是 选定主元后,将主元化为1,枚举除主元之外的所有行进行消元 即将矩阵化为对角矩阵,这样不用回代 bitset<N>a[N]; int ...

随机推荐

  1. SP703 SERVICE - Mobile Service

    思路:DP 提交:1次 题解: 我们把处理到的要求作为阶段. \(f[i][x][y][z]\)表示第 \(i\) 个要求,三个人分别的位置. 发现这样有很多无用状态,因为显然在第 \(i\) 个要求 ...

  2. 002_STM32程序移植之_DHT11

    1. 测试环境:STM32C8T6 2. 测试模块:DHT11温湿度模块 3. 测试接口: 1. DHT11温湿度模块接口: DS1302引脚 ---------单片机引脚 VCC---------- ...

  3. word黏贴图片显示不出来

    word图片转存,是指UEditor为了解决用户从word中复制了一篇图文混排的文章粘贴到编辑器之后,word文章中的图片数据无法显示在编辑器中,也无法提交到服务器上的问题而开发的一个操作简便的图片转 ...

  4. BZOJ 4241: 历史研究 ( 回 滚 )

    题目:  链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4241 题意:给你一个长度为n序列,m次查询,每次询问 一段区间 最大的  a[ i ...

  5. redis系列(三):python操作redis

    1.安装包 pip install redis 2.使用 # -*- coding: utf-8 -*- # @Time : 18-12-7 下午4:33 # @Author : Felix Wang ...

  6. CISCO实验记录七:OSPF

    一.要求 1.使用OSPF创建路由表 2.查看OSPF邻居 二.实现 1.使用OSPF创建路由表 #router ospf 1 #network 192.168.1.0 0.0.0.255 area ...

  7. 【Centos】搭建 SVN 服务器

    1.如果仅仅只是搭建 svn 服务器: (a).先检查 svn 是否已经安装了 rpm -qa subversion #输入这个命令后,会出现 subversion 版本号   (b).如果没有安装, ...

  8. 重新部署环境之后,总是提示表doesn't have a default value

    SQLSTATE[HY000]: General error: 1364 Field 'college' doesn't have a default value   数据库严格模式开启了,解决方法: ...

  9. LC 898. Bitwise ORs of Subarrays

    We have an array A of non-negative integers. For every (contiguous) subarray B = [A[i], A[i+1], ..., ...

  10. postgresql之 drop & delete & truncate

    官网:https://www.postgresql.org/docs/8.1/sql-droptable.html Name DROP TABLE -- remove a table Synopsis ...