fzu1704(高斯消元法解异或方程组+高精度输出)
题目链接: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(高斯消元法解异或方程组+高精度输出)的更多相关文章
- bzoj千题计划105:bzoj3503: [Cqoi2014]和谐矩阵(高斯消元法解异或方程组)
http://www.lydsy.com/JudgeOnline/problem.php?id=3503 b[i][j] 表示i对j是否有影响 高斯消元解异或方程组 bitset优化 #include ...
- poj1222(高斯消元法解异或方程组+开关问题)
题目链接:https://vjudge.net/problem/POJ-1222 题意:给定一个5×6的01矩阵,改变一个点的状态时它上下左右包括它自己的状态都会翻转,因为翻转2次等价与没有翻转,那么 ...
- bzoj千题计划187:bzoj1770: [Usaco2009 Nov]lights 燈 (高斯消元解异或方程组+枚举自由元)
http://www.lydsy.com/JudgeOnline/problem.php?id=1770 a[i][j] 表示i对j有影响 高斯消元解异或方程组 然后dfs枚举自由元确定最优解 #in ...
- 【BZOJ】2466: [中山市选2009]树 高斯消元解异或方程组
[题意]给定一棵树的灯,按一次x改变与x距离<=1的点的状态,求全0到全1的最少次数.n<=100. [算法]高斯消元解异或方程组 [题解]设f[i]=0/1表示是否按第i个点的按钮,根据 ...
- Bzoj3517 翻硬币题解 解异或方程组
3517: 翻硬币 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 281 Solved: 211[Submit][Status][Discuss] D ...
- 高斯消元法求解异或方程组: cojs.tk 539.//BZOJ 1770 牛棚的灯
高斯消元求解异或方程组: 比较不错的一篇文章:http://blog.sina.com.cn/s/blog_51cea4040100g7hl.html cojs.tk 539. 牛棚的灯 ★★☆ ...
- POJ 1222 EXTENDED LIGHTS OUT(高斯消元解异或方程组)
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 10835 Accepted: 6 ...
- bzoj千题计划188:bzoj1923: [Sdoi2010]外星千足虫 (高斯—若尔当消元法解异或方程组)
http://www.lydsy.com/JudgeOnline/problem.php?id=1923 #include<cstdio> #include<cstring> ...
- 高斯—若尔当(约当)消元法解异或方程组+bitset优化模板
高斯消元法是将矩阵化为上三角矩阵 高斯—若尔当消元法是 选定主元后,将主元化为1,枚举除主元之外的所有行进行消元 即将矩阵化为对角矩阵,这样不用回代 bitset<N>a[N]; int ...
随机推荐
- BER
BER全称Bit Error Ratio,比特出错概率,是衡量通信系统性能的最根本指标. 采用纠错编码,只要纠前BER小于某个门限值(BER容限点),纠错编码后就能实现纠后误码率为零的传输. 一般情况 ...
- Flutter布局5---Container
Container 容器 简介一个常用的widget,它结合了常见的绘画,定位和大小调整·该容器首先让child填充绘制,然后再将其他的约束应用于填充范围.·在绘画过程中,容器先应用给定的转换,再绘制 ...
- AtomicInteger如何保证线程安全以及乐观锁/悲观锁的概念
众所周知,JDK提供了AtomicInteger保证对数字的操作是线程安全的,线程安全我首先想到了synchronized和Lock,但是这种方式又有一个名字,叫做互斥锁,一次只能有一个持有锁的线程进 ...
- RabbitMq、ActiveMq、Kafka和Redis做Mq对比
转载自:https://blog.csdn.net/qiqizhiyun/article/details/79848834 一.RabbitMq RabbitMQ是一个Advanced Message ...
- [UVa12345] Dynamic len (带 修 )
题意:有n个数编号从0→n-1,两种操作: Q L R:询问编号为L→R-1的数中共有多少种不同的数 M X Y:将编号为X的数改为Y ...
- win10以及ubuntu下设置pip源
问题描述:有一段时间下载python库的时候速度非常慢,想着提高安装python库的速度. window10下: 一:首先进入c盘的用户目录,如我的目录为C:\Users\felix. 二:创建名为p ...
- MySQL数据分析(7)-试着使用SQL
(一) 1.1 启动服务器 Windows版命令: net start mysql 或者 C:\mysql-5.5.20-winx64\mysql-5.5.20-winx64\mysql Mac版命令 ...
- postman学习总结
从网上各处学习总结,会有不足之处,后期不断补充中... 一.get\post请求参数 1.get类型 (1)选择请求方式GET (2)输入完整的URL (3)在param中填写参数,点击send发送请 ...
- MongoDB-比较符及修改器
数学比较符 $lt 小于 $lte 小于等于 $gt 大于 $gte 大于等于 $eq 等于 $ne 不等于 所有数据 > db.stutent.find() }) { "_id&qu ...
- centos6中安装VMware Tools
使用的是centos6.8,其他6版本方法大致相同. 1 .工具/原料1)安装过虚拟机软件的计算机2)linux操作系统 3)虚拟机配置VMware tools文件, 点击工具栏上的[虚拟机],然后选 ...