zoukankan      html  css  js  c++  java
  • poj1830(求解xor方程组)

    4800: Poj1830 开关问题

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 16  Solved: 15
    [Submit][Status][Web Board]

    Description

    有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关
    联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开。你的目标
    是经过若干次开关操作后使得最后N个开关达到一个特定的状态。对于任意一个开关,最多只能进行一次开关操作
    。你的任务是,计算有多少种可以达到指定状态的方法。(不计开关操作的顺序)

    Input

    输入第一行有一个数K,表示以下有K组测试数据。 
    每组测试数据的格式如下: 
    第一行 一个数N(0 < N < 29) 
    第二行 N个0或者1的数,表示开始时N个开关状态。 
    第三行 N个0或者1的数,表示操作结束后N个开关的状态。 
    接下来 每行两个数I J,表示如果操作第 I 个开关,第J个开关的状态也会变化。每组数据以 0 0 结束。 

    Output

    如果有可行方法,输出总数,否则输出“Oh,it's impossible~!!” 不包括引号

    Sample Input

    2
    3
    0 0 0
    1 1 1
    1 2
    1 3
    2 1
    2 3
    3 1
    3 2
    0 0
    3
    0 0 0
    1 0 1
    1 2
    2 1
    0 0

    Sample Output

    4
    Oh,it's impossible~!!
    Hint
    第一组数据的说明: 
    一共以下四种方法: 
    操作开关1 
    操作开关2 
    操作开关3 
    操作开关1、2、3 (不记顺序) 

    HINT

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    
    int a[100];
    
    int main(){
        int k;
        int n;
        scanf("%d",&k);
        while(k--){
            memset(a,0,sizeof(a));
            scanf("%d",&n);
            for (int i=1;i<=n;i++){
                scanf("%d",&a[i]);
            }
            int p;
            for (int i=1;i<=n;i++){
                scanf("%d",&p);
                a[i]^=p;
                a[i]|= (1<<i);
            }
            int x,y;
            while(scanf("%d%d",&x,&y)&&x){
                a[y]|=(1<<x);
            }
            int ans=1;
            for (int i=1;i<=n;i++){
                for (int j=i+1;j<=n;j++) if(a[i]<a[j]) swap(a[i],a[j]);
                if(a[i]==0) {ans=(1<<(n-i+1));break;}
                if(a[i]==1) {ans=0;break;}
                for (int k=n;k;k--){与解一般方程不同,要找最高位为1的主元
                    if(a[i]>>k&1){
                        for (int j=1;j<=n;j++){
                            if(i!=j&&(a[j]>>k&1)) a[j]^=a[i];同为1则消元
                        }
                        break;
                    }
                }
            }
            if(ans==0) printf("Oh,it's impossible~!!
    ");
            else printf("%d
    ",ans);
        }
    return 0;
    }
  • 相关阅读:
    AS3 Signals
    Activate、Deactivate 事件 Activate ThrottleEvent;
    Git 单机版
    SVN 快速入门
    Git 简介
    SVN
    Git
    Python 对目录做遍历
    Python hashlib 模块
    __name__
  • 原文地址:https://www.cnblogs.com/lmjer/p/9179279.html
Copyright © 2011-2022 走看看