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 ...
随机推荐
- HR# 5题解
T1 我傻了 前20个数暴力开桶记录,后面的每次暴力统计. #include<bits/stdc++.h> #define R register int using namespace s ...
- centos 利用iptables来配置linux禁止所有端口登陆和开放指定端口的方法
1.关闭所有的 INPUT FORWARD OUTPUT 只对某些端口开放. 下面是命令实现: iptables -P INPUT DROPiptables -P FORWARD DROPiptabl ...
- Smali基础知识
Smali是用于Dalvik(Android虚拟机)的反汇编程序实现 汇编工具(将Smali代码汇编为dex文件)为smali.jar baksmali.jar则是反汇编程序 地址:https://b ...
- JS的十大排序算法
名词解释: n: 数据规模k:“桶”的个数In-place: 占用常数内存,不占用额外内存Out-place: 占用额外内存稳定性:排序后2个相等键值的顺序和排序之前它们的顺序相同 冒泡排序(Bub ...
- Hadoop环境搭建|第四篇:hive环境搭建
一.环境搭建 注意:hive版本不能太高,否则会出现兼容性问题 1.1.上传hive安装包 创建文件夹用于存放hive文件命令:mkdir hive 1.2.解压hive安装包 命令:tar -zxv ...
- Java并发指南9:AQS共享模式与并发工具类的实现
一行一行源码分析清楚 AbstractQueuedSynchronizer (三) 转自:https://javadoop.com/post/AbstractQueuedSynchronizer-3 ...
- AOP 底层实现原理
1.核心业务接口与实现 public interface IManager { void add(String item); } public class IManagerImpl implement ...
- Thymeleaf th:include、th:replace引用
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" ...
- Android 自定义AlertDialog退出对话框
Android 自定义AlertDialog退出对话框 转 https://blog.csdn.net/wkh11/article/details/53081634在项目中很多时候会出现点击返回键出现 ...
- Qt打开文件QFileDialog
//打开Pts文件按钮点击事件void AnalysisPtsDataTool201905::OnOpenFileButtonClick(){ qDebug()<<"open f ...