题目链接: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. ora-28002

    1.查看指定概要文件(如default)的密码有效期设置: SELECT * FROM dba_profiles s WHERE s.profile='DEFAULT' AND resource_na ...

  2. 51nod 1086

    https://www.cnblogs.com/TnT2333333/p/6879709.html 二进制优化多重背包 怎么用二进制优化多重背包,举一个例子就明白了. 如果要放n个苹果,可以将n个苹果 ...

  3. locale与C字符编码

    ref: https://www.cnblogs.com/gatsby123/p/11150472.html Unicode 字符集 代码点 与编码表中的某个字符对应的代码值.在Unicode标准中, ...

  4. Luogu5369 [PKUSC2018]最大前缀和

    题目链接:洛谷 题目大意:给定一个长为$n$的整数序列,求全排列的最大前缀和(必须包含第一个数)之和. 数据范围:$1\leq n\leq 20,1\leq \sum_{i=1}^n|a_i|\leq ...

  5. vue中.sync修饰符,实现子组件实时更新父组件的值

    vue 修饰符sync的功能是:当一个子组件改变了一个 prop 的值时,这个变化也会同步到父组件中所绑定. 不过它有一个前身,先来看看.sync出现之前是如何实现的 父组件中(传递给子组件一个值:p ...

  6. 2019.7.9 校内测试 T2 极值问题

    这一次是交流测试?边交流边测试(滑稽 极值问题 乍一看这是一道数学题,因为1e9的数据让我暴力的心退却. 数学又不好,不会化简式子嘞,咋办? 不怕,咱会打表找规律.(考场上真的是打表找出了规律,打表打 ...

  7. jmeter怎么上传图片

    1.使用Fiddler抓取上传图片的接口地址,将地址接口按规定粘贴到Jmeter的HTTP请求内(复制粘贴注意空格)(我已经有HTTP默认请求页,所以这里不需要配置) 2.HTTP请求页选择[高级-客 ...

  8. windows下使用curl命令&&常用curl命令

    什么是curl命令? curl是利用URL语法在命令行方式下工作的开源文件传输工具.它被广泛应用在Unix.多种Linux发行版中,并且有DOS和Win32.Win64下的移植版本. 如何在windo ...

  9. js中两个感叹号的原理与用法分析

    在javascript中有时会看到有两个!!的用法 var foo; alert(!foo);//undifined情况下,一个感叹号返回的是true; alert(!goo);//null情况下,一 ...

  10. 黑马vue---37-38、vue实例的生命周期

    黑马vue---37-38.vue实例的生命周期 一.总结 一句话总结: created:实例已经在内存中创建OK,此时 data 和 methods 已经创建OK,此时还没有开始 编译模板 moun ...