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

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

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

AC代码:

  1. #include<iostream>
  2. #include<string>
  3. #include<cstdio>
  4. #include<cstdlib>
  5. #include<algorithm>
  6. #include<cmath>
  7. #include<cstring>
  8. using namespace std;
  9.  
  10. int compare(string str1,string str2){
  11. int len1=str1.length(),len2=str2.length();
  12. if(len1<len2)
  13. return -;
  14. else if(len1>len2)
  15. return ;
  16. else
  17. return str1.compare(str2);
  18. }
  19.  
  20. //高精度加法,只能是两个正数相加
  21. string add(string str1,string str2){
  22. string str;
  23. int len1=str1.length(),len2=str2.length();
  24. if(len1<len2)
  25. for(int i=;i<=len2-len1;i++)
  26. str1=""+str1;
  27. else
  28. for(int i=;i<=len1-len2;i++)
  29. str2=""+str2;
  30. int cf=,tmp;
  31. len1=str1.length();
  32. for(int i=len1-;i>=;i--){
  33. tmp=str1[i]-''+str2[i]-''+cf;
  34. cf=tmp/;
  35. tmp%=;
  36. str=char(tmp+'')+str;
  37. }
  38. if(cf)
  39. str=""+str;
  40. return str;
  41. }
  42.  
  43. //高精度减法,只能是两个正数相减,而且要大减小
  44. string sub(string str1,string str2){
  45. string str;
  46. int len1=str1.length(),len2=str2.length();
  47. for(int i=;i<=len1-len2;i++)
  48. str2=""+str2;
  49. int cf=;
  50. for(int i=len1-;i>=;i--){
  51. if(str1[i]-cf>=str2[i]){
  52. str=char(str1[i]-cf-str2[i]+'')+str;
  53. cf=;
  54. }
  55. else{
  56. str=char(str1[i]-cf-str2[i]++'')+str;
  57. cf=;
  58. }
  59. }
  60. str.erase(,str.find_first_not_of(''));
  61. if(str.empty())
  62. str="";
  63. return str;
  64. }
  65. //高精度乘法,只能是两个正数相乘
  66. string mul(string str1,string str2){
  67. string str;
  68. int len1=str1.length(),len2=str2.length();
  69. for(int i=len2-;i>=;i--){
  70. string tmpstr;
  71. int tmp=str2[i]-'',cf=,t;
  72. if(tmp){
  73. for(int j=;j<=len2--i;j++)
  74. tmpstr+="";
  75. for(int j=len1-;j>=;j--){
  76. t=(tmp*(str1[j]-'')+cf)%;
  77. cf=(tmp*(str1[j]-'')+cf)/;
  78. tmpstr=char(t+'')+tmpstr;
  79. }
  80. if(cf)
  81. tmpstr=char(cf+'')+tmpstr;
  82. }
  83. str=add(str,tmpstr);
  84. }
  85. str.erase(,str.find_first_not_of('')); //删除前面多余的0,因为如果是0×10,结果将会是00
  86. if(str.empty())
  87. str="";
  88. return str;
  89. }
  90. //高精度除法,只能是两个正数相除
  91. void div(string str1,string str2,string& con,string &rem){
  92. if(str2=="")
  93. return;
  94. else if(str1==""){
  95. con="",rem="";
  96. return;
  97. }
  98. else if(compare(str1,str2)<){
  99. con="",rem=str1;
  100. return;
  101. }
  102. else if(compare(str1,str2)==){
  103. con="",rem="";
  104. return;
  105. }
  106. else{
  107. int len1=str1.length(),len2=str2.length();
  108. string tmpstr;
  109. for(int i=;i<len2-;i++)
  110. tmpstr=tmpstr+str1[i];
  111. for(int i=len2-;i<len1;i++){
  112. tmpstr=tmpstr+str1[i];
  113. tmpstr.erase(,tmpstr.find_first_not_of(''));
  114. if(tmpstr.empty())
  115. tmpstr="";
  116. for(char j='';j>='';j--){
  117. string str,tmp;
  118. str=str+j;
  119. tmp=mul(str,str2);
  120. if(compare(tmp,tmpstr)<=){
  121. con=con+j;
  122. tmpstr=sub(tmpstr,tmp);
  123. break;
  124. }
  125. }
  126. }
  127. rem=tmpstr;
  128. }
  129. con.erase(,con.find_first_not_of(''));
  130. if(con.empty())
  131. con="";
  132. }
  133.  
  134. bool JudgeZero(string s1){
  135. for(int i=;i<s1.length();++i)
  136. if(s1[i]!='') return false;
  137. return true;
  138. }
  139.  
  140. string gcd(string a,string b){
  141. if(!JudgeZero(b)){
  142. string s1,s2;
  143. div(a,b,s1,s2);
  144. return gcd(b,s2);
  145. }
  146. return a;
  147. }
  148.  
  149. string lcm(string a,string b){
  150. string t=gcd(a,b),s1,s2;
  151. a=mul(a,b);
  152. div(a,t,s1,s2);
  153. return s1;
  154. }
  155. const int maxn=;
  156. int T,equ,var,a[maxn][maxn],x[maxn];
  157.  
  158. int Gauss(){
  159. int k=,max_r;
  160. for(int col=;k<equ&&col<var;++k,++col){
  161. max_r=k;
  162. for(int i=k+;i<equ;++i){
  163. if(abs(a[i][col])>abs(a[max_r][col]))
  164. max_r=i;
  165. }
  166. if(max_r!=k){
  167. for(int i=col;i<var+;++i)
  168. swap(a[max_r][i],a[k][i]);
  169. }
  170. if(!a[k][col]){
  171. --k;
  172. continue;
  173. }
  174. for(int i=k+;i<equ;++i){
  175. if(!a[i][col]) continue;
  176. for(int j=col;j<var+;++j)
  177. a[i][j]^=a[k][j];
  178. }
  179. }
  180. for(int i=k;i<equ;++i)
  181. if(a[i][var])
  182. return -;
  183. return var-k;
  184. }
  185.  
  186. int main(){
  187. scanf("%d",&T);
  188. while(T--){
  189. scanf("%d%d",&equ,&var);
  190. for(int i=;i<equ;++i)
  191. for(int j=;j<var+;++j)
  192. a[i][j]=;
  193. for(int i=;i<var+;++i)
  194. x[i]=;
  195. for(int i=;i<equ;++i)
  196. scanf("%d",&a[i][var]);
  197. for(int i=;i<var;++i){
  198. int t1,t2;
  199. scanf("%d",&t1);
  200. while(t1--){
  201. scanf("%d",&t2);
  202. --t2;
  203. a[t2][i]=;
  204. }
  205. }
  206. int t=Gauss();
  207. string s1,s2;
  208. s1=s1+"",s2=s2+"";
  209. while(t--)
  210. s1=mul(s1,s2);
  211. cout<<s1<<endl;
  212. }
  213. return ;
  214. }

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. HR# 5题解

    T1 我傻了 前20个数暴力开桶记录,后面的每次暴力统计. #include<bits/stdc++.h> #define R register int using namespace s ...

  2. centos 利用iptables来配置linux禁止所有端口登陆和开放指定端口的方法

    1.关闭所有的 INPUT FORWARD OUTPUT 只对某些端口开放. 下面是命令实现: iptables -P INPUT DROPiptables -P FORWARD DROPiptabl ...

  3. Smali基础知识

    Smali是用于Dalvik(Android虚拟机)的反汇编程序实现 汇编工具(将Smali代码汇编为dex文件)为smali.jar baksmali.jar则是反汇编程序 地址:https://b ...

  4. JS的十大排序算法

     名词解释: n: 数据规模k:“桶”的个数In-place: 占用常数内存,不占用额外内存Out-place: 占用额外内存稳定性:排序后2个相等键值的顺序和排序之前它们的顺序相同 冒泡排序(Bub ...

  5. Hadoop环境搭建|第四篇:hive环境搭建

    一.环境搭建 注意:hive版本不能太高,否则会出现兼容性问题 1.1.上传hive安装包 创建文件夹用于存放hive文件命令:mkdir hive 1.2.解压hive安装包 命令:tar -zxv ...

  6. Java并发指南9:AQS共享模式与并发工具类的实现

    一行一行源码分析清楚 AbstractQueuedSynchronizer (三) 转自:https://javadoop.com/post/AbstractQueuedSynchronizer-3 ...

  7. AOP 底层实现原理

    1.核心业务接口与实现 public interface IManager { void add(String item); } public class IManagerImpl implement ...

  8. Thymeleaf th:include、th:replace引用

    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" ...

  9. Android 自定义AlertDialog退出对话框

    Android 自定义AlertDialog退出对话框 转 https://blog.csdn.net/wkh11/article/details/53081634在项目中很多时候会出现点击返回键出现 ...

  10. Qt打开文件QFileDialog

    //打开Pts文件按钮点击事件void AnalysisPtsDataTool201905::OnOpenFileButtonClick(){ qDebug()<<"open f ...