UVa 11542 (高斯消元 异或方程组) Square
书上分析的太清楚,我都懒得写题解了。=_=||
- #include <cstdio>
- #include <cstring>
- #include <cmath>
- #include <algorithm>
- using namespace std;
- const int maxp = ;
- const int maxn = ;
- bool vis[maxn + ];
- int prime[maxp], pcnt = ;
- void Init()
- {
- int m = sqrt(maxn + 0.5);
- for(int i = ; i <= m; i++) if(!vis[i])
- for(int j = i*i; j <= maxn; j += i) vis[j] = true;
- for(int i = ; i <= maxn; i++) if(!vis[i]) prime[pcnt++] = i;
- }
- typedef int Matrix[maxn][maxn];
- Matrix A;
- int rank(Matrix A, int m, int n)
- {//求系数矩阵A的秩,m个方程,n个未知数
- int i = , j = ;
- while(i < m && j < n)
- {
- int r = i, k;
- for(k = r; k < m; k++) if(A[k][j]) { r = k; break; }
- if(k < m)
- {
- if(r != i) for(int k = ; k < n; k++) swap(A[r][k], A[i][k]);
- for(int k = i+; k < m; k++) if(A[k][j])
- for(int l = j; l < n; l++) A[k][l] ^= A[i][l];
- i++;
- }
- j++;
- }
- return i;
- }
- int main()
- {
- //freopen("in.txt", "r", stdin);
- Init();
- int T;
- scanf("%d", &T);
- while(T--)
- {
- memset(A, , sizeof(A));
- int n, M = ;
- scanf("%d", &n);
- for(int i = ; i < n; i++)
- {
- long long x;
- scanf("%lld", &x);
- for(int j = ; j < pcnt; j++) while(x % prime[j] == )
- {
- M = max(M, j);
- x /= prime[j];
- A[j][i] ^= ;
- }
- }
- int r = rank(A, M+, n);//共用到前M+1个素数
- printf("%lld\n", (1LL << (n-r)) - );
- }
- return ;
- }
代码君
最后lrj老师提到了还可以用状压加速消元,因为500以内的素数不超过100个,所以我用了两个64位的long long来表示一个方程。第一份代码16ms,状压以后12ms,快了四分之一。
- #include <cstdio>
- #include <cstring>
- #include <cmath>
- #include <algorithm>
- using namespace std;
- const int maxp = ;
- const int maxn = ;
- bool vis[maxn + ];
- int prime[maxp], pcnt = ;
- void Init()
- {
- int m = sqrt(maxn + 0.5);
- for(int i = ; i <= m; i++) if(!vis[i])
- for(int j = i*i; j <= maxn; j += i) vis[j] = true;
- for(int i = ; i <= maxn; i++) if(!vis[i]) prime[pcnt++] = i;
- }
- typedef long long Matrix[maxn][];
- Matrix A;
- int rank(Matrix A, int m, int n)
- {//求系数矩阵A的秩,m个方程,n个未知数
- int i = , j = , len = n / ;
- while(i < m && j < n)
- {
- int r = i, k;
- for(k = r; k < m; k++) if(A[k][j/] & (1LL<<(j%))) { r = k; break; }
- if(k < m)
- {
- if(r != i) for(int k = ; k <= len; k++) swap(A[r][k], A[i][k]);
- for(int k = i+; k < m; k++) if(A[k][j/] & (1LL<<(j%)))
- for(int l = ; l <= len; l++) A[k][l] ^= A[i][l];
- i++;
- }
- j++;
- }
- return i;
- }
- int main()
- {
- //freopen("in.txt", "r", stdin);
- Init();
- int T;
- scanf("%d", &T);
- while(T--)
- {
- memset(A, , sizeof(A));
- int n, M = ;
- scanf("%d", &n);
- for(int i = ; i < n; i++)
- {
- long long x;
- scanf("%lld", &x);
- for(int j = ; j < pcnt; j++) while(x % prime[j] == )
- {
- M = max(M, j);
- x /= prime[j];
- A[j][i/] ^= (1LL << (i%) );
- }
- }
- int r = rank(A, M+, n);//共用到前M+1个素数
- printf("%lld\n", (1LL << (n-r)) - );
- }
- return ;
- }
代码君
UVa 11542 (高斯消元 异或方程组) Square的更多相关文章
- BZOJ.1923.[SDOI2010]外星千足虫(高斯消元 异或方程组 bitset)
题目链接 m个方程,n个未知量,求解异或方程组. 复杂度比较高,需要借助bitset压位. 感觉自己以前写的(异或)高斯消元是假的..而且黄学长的写法都不需要回代. //1100kb 324ms #i ...
- UVA11542 Square(高斯消元 异或方程组)
建立方程组消元,结果为2 ^(自由变元的个数) - 1 采用高斯消元求矩阵的秩 方法一: #include<cstdio> #include<iostream> #includ ...
- Tsinsen-A1488 : 魔法波【高斯消元+异或方程组】
高斯消元. 自己只能想出来把每一个点看成一个变量,用Xi表示其状态,这样必定TLE,n^2 个变量,再加上3次方的高斯消元(当然,可以用bitset压位). 正解如下: 我们把地图划分成一个个的横条和 ...
- UVA 11542 高斯消元
从数组中选择几个数,要求他们的乘积可以开平方,问有多少种方案. 先将单个数拆分成质因子,对于这个数而言,那些指数为奇数的质因子会使这个数无法被开平方. 所以我们需要选择一个对应质因子指数为奇数的元素, ...
- UVA 11542 Square 高斯消元 异或方程组求解
题目链接:点击打开链接 白书的例题练练手. . . P161 #include <cstdio> #include <iostream> #include <algori ...
- POJ.1830.开关问题(高斯消元 异或方程组)
题目链接 显然我们需要使每个i满足\[( ∑_{j} X[j]*A[i][j] ) mod\ 2 = B[i]\] 求这个方程自由元Xi的个数ans,那么方案数便是\(2^{ans}\) %2可以用^ ...
- 【高斯消元解xor方程组】BZOJ2466-[中山市选2009]树
[题目大意] 给出一棵树,初始状态均为0,每反转一个节点的状态,相邻的节点(父亲或儿子)也会反转,问要使状态均为1,至少操作几次? [思路] 一场大暴雨即将来临,白昼恍如黑夜!happy! 和POJ1 ...
- poj1830(高斯消元解mod2方程组)
题目链接:http://poj.org/problem?id=1830 题意:中文题诶- 思路:高斯消元解 mod2 方程组 有 n 个变元,根据给出的条件列 n 个方程组,初始状态和终止状态不同的位 ...
- POJ 1222 EXTENDED LIGHTS OUT(高斯消元解XOR方程组)
http://poj.org/problem?id=1222 题意:现在有5*6的开关,1表示亮,0表示灭,按下一个开关后,它上下左右的灯泡会改变亮灭状态,要怎么按使得灯泡全部处于灭状态,输出方案,1 ...
随机推荐
- CentOS6.5安装tomcat7
把下载的apache-tomcat-7.0.19.tar.gz文件上传到服务器的根目录 #tar zxvf apache-tomcat-7.0.19.tar.gz #mv apache-t ...
- aspnet_regiis.exe 的用法
使用aspnet_regiis.exe注册.NET Framework 重新安装IIS以后,需要用aspnet_regiis.exe来注册.NET Framework, 如下: C:\WINDOWS\ ...
- 不同的source control下配置DiffMerge
TFS: 1. 打开Option -> Source Control -> Visual Studio TFS -> Configure User Tools; 2. 添加 .*, ...
- SVN提交错误:working copy is not up-to-date解决方法
我在项目中删了2个jar,然后SVN提交,一直提交不成功 svn在提交时报错如下图: working copy is not up-to-date svn:commit failed(details ...
- CSS滤镜详解
语法:STYLE="filter:filtername(fparameter1, fparameter2...)" (Filtername为滤镜的名称,fparameter1.fp ...
- 如何通过CSS3实现背景图片色彩的梯度渐变
随着网站的越来越普及,CSS3和HTML5必将成为网站前端发展的主流方向,特别是在移动端,高端浏览器给前端工程师们带来了无以言表的体验. 通俗的来讲,CSS3可以说是CSS技术的升级版本,CSS3语言 ...
- HTTP 错误 403.14 - Forbidden
在打开一个网站时,显示HTTP 错误 403.14 - Forbidden 是一件很不幸的事情.我这几天打开某网站就出现了这个问题.Web 服务器被配置为不列出此目录的内容,错误代码0x0000000 ...
- xargs 加 gm批量转换图片
%x50% @ ../-\ 南澳西涌_50%/@ 看了很多说明上都在用-i,这是一个已经废弃了的参数
- hdu 3123 GCC
这题分2种情况: 1) n>=m时,k!%m=0(k>=m),所以只需令n=m-1即可: 2) n<m时,正常情况处理即可. ;}
- 将集成spring的项目从tomcat上移植到weblogic下存在的问题
当在weblogic下部署时, 1.需要jersey-servlet-xx.jar,jersey-core-xx.jar,jersey-server-xx.jar: 2.在web.xml中全局参数co ...