高斯消元求方案数-HDU3364
来源:互联网 发布:王牌特工特工学院淘宝 编辑:程序博客网 时间:2024/06/05 12:46
https://vjudge.net/problem/HDU-3364
难点在于构建方程组
题目大意:
有 N 盏灯,M 个开关,每个开关可以控制多盏灯,每盏灯可以被多盏开关控制。开
始每盏灯都是开闭状态,给定每盏灯的最终状态,问有多少种方案可以到达。
解题思路:
对于每一盏灯,可以列出一个方程,这样就可以列出 N 个方程,有 M 个未知量。从
而构成一个 N*M 的矩阵,对应每盏灯的最终状态。构建一个增广矩阵,用高斯消元
法求解自由变元个数 Ans。因为开关只有开、关两种状态,所以答案为 2^Ans。
#include<iostream>#include<stdlib.h>#include<stdio.h>#include<string>#include<vector>#include<deque>#include<queue>#include<algorithm>#include<set>#include<map>#include<stack>#include<time.h>#include<math.h>#include<list>#include<cstring>#include<fstream>#include<bitset>#include<memory.h>using namespace std;#define ll long long#define ull unsigned long long#define pii pair<int,int>#define INF 1000000007const double EPS=1e-5;const int MAXN=55;int matrix[MAXN][MAXN];//保存增广矩阵int copyMatrix[MAXN][MAXN];//增广矩阵的副本int Gauss(int a[][MAXN],const int&m,const int&n){//m:变元个数 n:方程个数 int res=0,r=0;//res为自由变元个数 r为增广矩阵的秩 for(int i=0;i<m;++i){//处理第i个变元 for(int j=r;j<n;++j)//找到第i个变元系数不为0的方程 并放到第r行 if(a[j][i]){ for(int k=i;k<=m;++k) swap(a[j][k],a[r][k]); break; } if(a[r][i]==0){//第i个变元没有系数不为0的 这变元是自由变元 ++res; continue; } for(int j=0;j<n;++j)//消去其他方程的i变元 if((j!=r)&&(a[j][i]!=0)) for(int k=i;k<=m;++k) a[j][k]^=a[r][k]; ++r;//矩阵的秩+1 } //矩阵的秩下面的方程 系数都为0 0*x1+0*x2+...+0*xm恒等于0 !=0则无解 for(int i=r;i<n;++i) if(a[i][m])//判断是否无解 return -1; return res;}int main(){ int t,n,m; scanf("%d",&t); for(int ca=1;ca<=t;ca++) { scanf("%d%d",&n,&m); memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); for(int i=0;i<m;i++) { int k,index; scanf("%d",&k); for(int j=0;j<k;j++) { scanf("%d",&index); a[index-1][i]=1;//灯index-1受开关i影响 } } printf("Case %d:\n",ca); int q; scanf("%d",&q); while(q--) { for(int i=0;i<n;i++) for(int j=0;j<m;j++) b[i][j]=a[i][j]; for(int i=0;i<n;i++) scanf("%d",&b[i][m]);//b[i][m]是灯i最终的状态 ll res=gauss(b,m,n);//m个开关,n个灯 if(res==-1) res=0; else res=((ll)1)<<res; printf("%I64d\n",res); } } return 0;}
阅读全文
0 0
- 高斯消元求方案数-HDU3364
- HDU3364
- hdu3364 Lanterns
- HDU3364 Lanterns
- 高斯消元求方案数 POJ-1830
- hdu4200&&hdu3364 高斯消元
- hdu3364 Lanterns (高斯消元)
- hdu3364 Lanterns 高斯消元
- HDU3364 Lanterns【高斯消元法】
- HDU3364 Lanterns 高斯消元
- 高斯消元 hdu5833,hdu3364,hihocoder1195
- hdu3364-高斯消元(取模)
- D.截取方案数
- 方案数_ssl1792_dp
- hdu3534 树形DP+方案数
- poj2411 状态压缩~方案数
- hdu3006 状态压缩~方案数
- hdu3091 状态压缩~方案数
- P-残缺的棋盘
- synchronized和volatile理解
- 动态规划(一)
- linux下python调试
- 【单调队列】51nod 1275 连续子段的差异
- 高斯消元求方案数-HDU3364
- [版本控制]如何在GitHub上下载自己喜欢的开源代码并提交修改
- MySql 对性能产生影响的条件
- 构造方法
- Intellij idea破解办法
- 算法(2.5 应用)
- SSM整合,spring-mybatis配置,service,controller配置
- 机器学习实战——K-近邻算法【2:改进约会网站配对效果】
- springmvc注解时对象为null