hdu4200&&hdu3364 高斯消元
2012-09-14 12:21
204 查看
基础题目,犯了个小错误,调了很久,甭提多郁闷了,不多说了,直接贴代码。
4200ACcode:
3364ACcode:
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
const int size=55;
int n,m;
int a[size][size],g[size][size];
__int64 gauss()
{
int i,j,k;
int row=1,col=1;
for (;col<=m;col++)
{
for (i=row;i<=n;i++) if (g[i][col]) break;
if (i>n) continue;
if (i!=row) for (j=col;j<=m+1;j++)
k=g[row][j],g[row][j]=g[i][j],g[i][j]=k;
for (i=row+1;i<=n;i++) if (g[i][col])
for (j=col;j<=m+1;j++) g[i][j]=g[i][j]^g[row][j];
row++;
}
for (i=row;i<=n;i++) if (g[i][m+1]) return 0;
return 1LL<<(m+1-row);
}
int main()
{
int cas=0,t,i,j,k,q;
scanf("%d",&t);
while (t--)
{
printf("Case %d:\n",++cas);
memset(a,0,sizeof(a));
scanf("%d %d",&n,&m);
for (i=1;i<=m;i++)
{
scanf("%d",&k);
for (j=1;j<=k;j++) scanf("%d",&q),a[q][i]=1;
}
scanf("%d",&q);
while (q--)
{
for (i=1;i<=n;i++) scanf("%d",&g[i][m+1]);
for (i=1;i<=n;i++) for (j=1;j<=m;j++) g[i][j]=a[i][j];
printf("%I64d\n",gauss());
}
}
return 0;
}
4200ACcode:
#include<stdio.h> #include<string.h> #define min(a,b) a<b?a:b; #define max(a,b) a>b?a:b; int n,d,row,col,ans; char g[110][110]; int num[110]; void gauss() { int i,j,k; for (col=row=1;col<=n;col++) { for (i=row;i<=n;i++) if (g[i][col]) break; if (i>n) continue; if (i!=row) for (j=col;j<=n+1;j++) k=g[i][j],g[i][j]=g[row][j],g[row][j]=k; for (i=row+1;i<=n;i++) if (g[i][col]) for (j=col;j<=n+1;j++) g[i][j]^=g[row][j]; row++; } return ; } void dfs(int k) { if (k<=n) { num[k]=1,dfs(k+1); num[k]=0,dfs(k+1); } else { int i,j; for (i=row-1;i>0;i--) { k=g[i][n+1]; for (j=i+1;j<=n;j++) k^=g[i][j]&&num[j]; num[i]=k; } for (i=1,k=0;i<=n;i++) k+=num[i]; ans=min(k,ans); } return ; } int main() { int i,j,k,t,L,R; scanf("%d",&t); while (t--) { scanf("%d %d",&n,&d); memset(g,0,sizeof(g)); for (i=1;i<=n;i++) { scanf("%d",&g[i][n+1]); L=max(1,i-d); R=min(n,i+d); for (j=L;j<=R;j++) g[j][i]=1; } ans=110,gauss(); for (i=row;i<=n;i++) if (g[i][n+1]) break; if (i<=n) ans=-1; for (i=1;i<row;i++) { if (!g[i][i]) { for (j=i+1;j<=n;j++) if (g[i][j]) break; if (j>n) break; for (k=1;k<=n;k++) R=g[k][j],g[k][j]=g[k][i],g[k][i]=R; } } if (ans>0) dfs(row); printf(ans==-1?"impossible\n":"%d\n",ans); } return 0; }
3364ACcode:
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
const int size=55;
int n,m;
int a[size][size],g[size][size];
__int64 gauss()
{
int i,j,k;
int row=1,col=1;
for (;col<=m;col++)
{
for (i=row;i<=n;i++) if (g[i][col]) break;
if (i>n) continue;
if (i!=row) for (j=col;j<=m+1;j++)
k=g[row][j],g[row][j]=g[i][j],g[i][j]=k;
for (i=row+1;i<=n;i++) if (g[i][col])
for (j=col;j<=m+1;j++) g[i][j]=g[i][j]^g[row][j];
row++;
}
for (i=row;i<=n;i++) if (g[i][m+1]) return 0;
return 1LL<<(m+1-row);
}
int main()
{
int cas=0,t,i,j,k,q;
scanf("%d",&t);
while (t--)
{
printf("Case %d:\n",++cas);
memset(a,0,sizeof(a));
scanf("%d %d",&n,&m);
for (i=1;i<=m;i++)
{
scanf("%d",&k);
for (j=1;j<=k;j++) scanf("%d",&q),a[q][i]=1;
}
scanf("%d",&q);
while (q--)
{
for (i=1;i<=n;i++) scanf("%d",&g[i][m+1]);
for (i=1;i<=n;i++) for (j=1;j<=m;j++) g[i][j]=a[i][j];
printf("%I64d\n",gauss());
}
}
return 0;
}
相关文章推荐
- BZOJ:4820: [Sdoi2017]硬币游戏&&BZOJ:1444: [Jsoi2009]有趣的游戏(高斯消元求概率)
- hihocoder第57周hiho一下#1196 : 高斯消元·二
- NEFU 506&&ZOJ 3353 Chess Board (四种构造的高斯消元)
- HDU5088——Revenge of Nim II(高斯消元&矩阵的秩)(BestCoder Round #16)
- 高斯消元 hihoCoder1195 高斯消元·一
- poj1681-Painter's-Problem ( 高斯消元)
- 2017年中国大学生程序设计竞赛-中南地区赛暨第八届湘潭市大学生计算机程序设计大赛题解&源码(A.高斯消元,D,模拟,E,前缀和,F,LCS,H,Prim算法,I,胡搞,J,树状数组)
- 高斯消元 分析 && 模板 (转载)
- 高斯消元&&线性基 算法小结
- ACdream 1217 Cracking' RSA(高斯消元 + 大数)
- [POJ2947] Widget Factory && 高斯消元
- hdu3364-高斯消元(取模)
- HDU3359:Kind of a Blur(高斯消元 & 浮点数)
- poj1681 Painter's Problem 高斯消元
- hdu3364 Lanterns (高斯消元)
- [BZOJ2115][Wc2011] Xor && dfs+高斯消元
- 【POJ1681】Painter's Problem 高斯消元,求最小∑系数的异或方程组
- 【HDU3364】Lanterns-高斯消元求异或方程组的解数
- HDU3364(高斯消元开关问题)(模板)
- 高斯消元 & 线性基【学习笔记】