书上分析的太清楚,我都懒得写题解了。=_=||

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cmath>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. const int maxp = ;
  8. const int maxn = ;
  9. bool vis[maxn + ];
  10. int prime[maxp], pcnt = ;
  11.  
  12. void Init()
  13. {
  14. int m = sqrt(maxn + 0.5);
  15. for(int i = ; i <= m; i++) if(!vis[i])
  16. for(int j = i*i; j <= maxn; j += i) vis[j] = true;
  17. for(int i = ; i <= maxn; i++) if(!vis[i]) prime[pcnt++] = i;
  18. }
  19.  
  20. typedef int Matrix[maxn][maxn];
  21.  
  22. Matrix A;
  23.  
  24. int rank(Matrix A, int m, int n)
  25. {//求系数矩阵A的秩,m个方程,n个未知数
  26. int i = , j = ;
  27. while(i < m && j < n)
  28. {
  29. int r = i, k;
  30. for(k = r; k < m; k++) if(A[k][j]) { r = k; break; }
  31. if(k < m)
  32. {
  33. if(r != i) for(int k = ; k < n; k++) swap(A[r][k], A[i][k]);
  34. for(int k = i+; k < m; k++) if(A[k][j])
  35. for(int l = j; l < n; l++) A[k][l] ^= A[i][l];
  36. i++;
  37. }
  38. j++;
  39. }
  40. return i;
  41. }
  42.  
  43. int main()
  44. {
  45. //freopen("in.txt", "r", stdin);
  46.  
  47. Init();
  48. int T;
  49. scanf("%d", &T);
  50. while(T--)
  51. {
  52. memset(A, , sizeof(A));
  53. int n, M = ;
  54. scanf("%d", &n);
  55. for(int i = ; i < n; i++)
  56. {
  57. long long x;
  58. scanf("%lld", &x);
  59. for(int j = ; j < pcnt; j++) while(x % prime[j] == )
  60. {
  61. M = max(M, j);
  62. x /= prime[j];
  63. A[j][i] ^= ;
  64. }
  65. }
  66. int r = rank(A, M+, n);//共用到前M+1个素数
  67. printf("%lld\n", (1LL << (n-r)) - );
  68. }
  69.  
  70. return ;
  71. }

代码君

最后lrj老师提到了还可以用状压加速消元,因为500以内的素数不超过100个,所以我用了两个64位的long long来表示一个方程。第一份代码16ms,状压以后12ms,快了四分之一。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cmath>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. const int maxp = ;
  8. const int maxn = ;
  9. bool vis[maxn + ];
  10. int prime[maxp], pcnt = ;
  11.  
  12. void Init()
  13. {
  14. int m = sqrt(maxn + 0.5);
  15. for(int i = ; i <= m; i++) if(!vis[i])
  16. for(int j = i*i; j <= maxn; j += i) vis[j] = true;
  17. for(int i = ; i <= maxn; i++) if(!vis[i]) prime[pcnt++] = i;
  18. }
  19.  
  20. typedef long long Matrix[maxn][];
  21.  
  22. Matrix A;
  23.  
  24. int rank(Matrix A, int m, int n)
  25. {//求系数矩阵A的秩,m个方程,n个未知数
  26. int i = , j = , len = n / ;
  27. while(i < m && j < n)
  28. {
  29. int r = i, k;
  30. for(k = r; k < m; k++) if(A[k][j/] & (1LL<<(j%))) { r = k; break; }
  31. if(k < m)
  32. {
  33. if(r != i) for(int k = ; k <= len; k++) swap(A[r][k], A[i][k]);
  34. for(int k = i+; k < m; k++) if(A[k][j/] & (1LL<<(j%)))
  35. for(int l = ; l <= len; l++) A[k][l] ^= A[i][l];
  36. i++;
  37. }
  38. j++;
  39. }
  40. return i;
  41. }
  42.  
  43. int main()
  44. {
  45. //freopen("in.txt", "r", stdin);
  46.  
  47. Init();
  48. int T;
  49. scanf("%d", &T);
  50. while(T--)
  51. {
  52. memset(A, , sizeof(A));
  53. int n, M = ;
  54. scanf("%d", &n);
  55. for(int i = ; i < n; i++)
  56. {
  57. long long x;
  58. scanf("%lld", &x);
  59. for(int j = ; j < pcnt; j++) while(x % prime[j] == )
  60. {
  61. M = max(M, j);
  62. x /= prime[j];
  63. A[j][i/] ^= (1LL << (i%) );
  64. }
  65. }
  66. int r = rank(A, M+, n);//共用到前M+1个素数
  67. printf("%lld\n", (1LL << (n-r)) - );
  68. }
  69.  
  70. return ;
  71. }

代码君

UVa 11542 (高斯消元 异或方程组) Square的更多相关文章

  1. BZOJ.1923.[SDOI2010]外星千足虫(高斯消元 异或方程组 bitset)

    题目链接 m个方程,n个未知量,求解异或方程组. 复杂度比较高,需要借助bitset压位. 感觉自己以前写的(异或)高斯消元是假的..而且黄学长的写法都不需要回代. //1100kb 324ms #i ...

  2. UVA11542 Square(高斯消元 异或方程组)

    建立方程组消元,结果为2 ^(自由变元的个数) - 1 采用高斯消元求矩阵的秩 方法一: #include<cstdio> #include<iostream> #includ ...

  3. Tsinsen-A1488 : 魔法波【高斯消元+异或方程组】

    高斯消元. 自己只能想出来把每一个点看成一个变量,用Xi表示其状态,这样必定TLE,n^2 个变量,再加上3次方的高斯消元(当然,可以用bitset压位). 正解如下: 我们把地图划分成一个个的横条和 ...

  4. UVA 11542 高斯消元

    从数组中选择几个数,要求他们的乘积可以开平方,问有多少种方案. 先将单个数拆分成质因子,对于这个数而言,那些指数为奇数的质因子会使这个数无法被开平方. 所以我们需要选择一个对应质因子指数为奇数的元素, ...

  5. UVA 11542 Square 高斯消元 异或方程组求解

    题目链接:点击打开链接 白书的例题练练手. . . P161 #include <cstdio> #include <iostream> #include <algori ...

  6. POJ.1830.开关问题(高斯消元 异或方程组)

    题目链接 显然我们需要使每个i满足\[( ∑_{j} X[j]*A[i][j] ) mod\ 2 = B[i]\] 求这个方程自由元Xi的个数ans,那么方案数便是\(2^{ans}\) %2可以用^ ...

  7. 【高斯消元解xor方程组】BZOJ2466-[中山市选2009]树

    [题目大意] 给出一棵树,初始状态均为0,每反转一个节点的状态,相邻的节点(父亲或儿子)也会反转,问要使状态均为1,至少操作几次? [思路] 一场大暴雨即将来临,白昼恍如黑夜!happy! 和POJ1 ...

  8. poj1830(高斯消元解mod2方程组)

    题目链接:http://poj.org/problem?id=1830 题意:中文题诶- 思路:高斯消元解 mod2 方程组 有 n 个变元,根据给出的条件列 n 个方程组,初始状态和终止状态不同的位 ...

  9. POJ 1222 EXTENDED LIGHTS OUT(高斯消元解XOR方程组)

    http://poj.org/problem?id=1222 题意:现在有5*6的开关,1表示亮,0表示灭,按下一个开关后,它上下左右的灯泡会改变亮灭状态,要怎么按使得灯泡全部处于灭状态,输出方案,1 ...

随机推荐

  1. CentOS6.5安装tomcat7

    把下载的apache-tomcat-7.0.19.tar.gz文件上传到服务器的根目录    #tar zxvf apache-tomcat-7.0.19.tar.gz    #mv apache-t ...

  2. aspnet_regiis.exe 的用法

    使用aspnet_regiis.exe注册.NET Framework 重新安装IIS以后,需要用aspnet_regiis.exe来注册.NET Framework, 如下: C:\WINDOWS\ ...

  3. 不同的source control下配置DiffMerge

    TFS: 1. 打开Option -> Source Control -> Visual Studio TFS -> Configure User Tools; 2. 添加 .*, ...

  4. SVN提交错误:working copy is not up-to-date解决方法

    我在项目中删了2个jar,然后SVN提交,一直提交不成功 svn在提交时报错如下图: working copy is not up-to-date svn:commit failed(details ...

  5. CSS滤镜详解

    语法:STYLE="filter:filtername(fparameter1, fparameter2...)" (Filtername为滤镜的名称,fparameter1.fp ...

  6. 如何通过CSS3实现背景图片色彩的梯度渐变

    随着网站的越来越普及,CSS3和HTML5必将成为网站前端发展的主流方向,特别是在移动端,高端浏览器给前端工程师们带来了无以言表的体验. 通俗的来讲,CSS3可以说是CSS技术的升级版本,CSS3语言 ...

  7. HTTP 错误 403.14 - Forbidden

    在打开一个网站时,显示HTTP 错误 403.14 - Forbidden 是一件很不幸的事情.我这几天打开某网站就出现了这个问题.Web 服务器被配置为不列出此目录的内容,错误代码0x0000000 ...

  8. xargs 加 gm批量转换图片

    %x50% @ ../-\ 南澳西涌_50%/@ 看了很多说明上都在用-i,这是一个已经废弃了的参数

  9. hdu 3123 GCC

    这题分2种情况: 1) n>=m时,k!%m=0(k>=m),所以只需令n=m-1即可: 2) n<m时,正常情况处理即可. ;}

  10. 将集成spring的项目从tomcat上移植到weblogic下存在的问题

    当在weblogic下部署时, 1.需要jersey-servlet-xx.jar,jersey-core-xx.jar,jersey-server-xx.jar: 2.在web.xml中全局参数co ...