POJ1830开关问题

本文介绍了一种使用高斯消元法求解线性方程组中自由元数量的方法,并提供了完整的C++代码实现。通过该方法可以高效地计算出自变量可能的解的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这题答案就是2^自由元的数目,原因是自由元可以取1或者0,所以就是ans<<1

由于只要求自由元的数目,所以高斯消元可以直接消后面的,不做前面的了,对答案没有影响

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<algorithm>
 4 #include<cstring>
 5 #define MAXN 35
 6 using namespace std;
 7 int a[MAXN][MAXN];
 8 int gauss(int m,int n){
 9     int ret=0,line=1;
10     for(int k=1;k<=m;k++){
11         int i=line;
12         while(i<=m){if(a[i][k])break;i++;}
13         if(i>m){ret++;continue;}//自由元 
14         if(i!=line){for(int j=k;j<=n;j++)swap(a[i][j],a[line][j]);}
15         for(i=line+1;i<=m;i++){
16             if(a[i][k]){
17                 for(int j=k;j<=n;j++){
18                     a[i][j]^=a[line][j];
19                 }
20             }
21         }
22         line++;
23     }
24     for(int i=line;i<=m;i++)if(a[i][n])return -1;
25     //最后一定都消成0了,所以a[i][n]必须为0才符合题意 
26     return ret;
27 }
28 int n;
29 void solve(){
30     memset(a,0,sizeof(a));
31     scanf("%d",&n);
32     for(int i=1;i<=n;i++)scanf("%d",&a[i][n+1]);
33     int x,y;
34     for(int i=1;i<=n;i++){scanf("%d",&x);a[i][n+1]^=x;}
35     for(int i=1;i<=n;i++){a[i][i]=1;}
36     while(1){
37         scanf("%d%d",&x,&y);
38         if(!x&&!y)break;
39         a[y][x]=1;
40     }
41     int ans=gauss(n,n+1);
42     if(-1==ans)printf("Oh,it's impossible~!!\n");
43     else printf("%d\n",1<<ans);
44 }
45 int main()
46 {
47 //    freopen("data.in","r",stdin);
48     int T;
49     scanf("%d",&T);
50     while(T--){
51         solve();
52     }
53     return 0;
54 }

 

转载于:https://www.cnblogs.com/w-h-h/p/8278150.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值