zoukankan      html  css  js  c++  java
  • poj1830 开关问题

    粘题面:

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

     题解:

    高消,然后你会得到一堆自由元(设为$k$)。

    所有自由元不会互相影响,不然就不自由了。

    对于所有自由元的每一组取值,其他元都有唯一解。

    所以合法时答案为$2^{k}$。

    代码:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int N = 35;
    int t,n;
    int a[N][N],b[N];
    int gs()
    {
        int l1,l2;
        for(l1=l2=1;l1<=n&&l2<=n;l1++,l2++)
        {
            int tmp = l1;
            while(tmp<=n&&!a[tmp][l2])tmp++;
            if(tmp>n)
            {
                l1--;
                continue;
            }
            if(tmp!=l1)
                for(int j=l2;j<=n+1;j++)swap(a[l1][j],a[tmp][j]);
            for(int i=l1+1;i<=n;i++)if(a[i][l2])
                for(int j=l2;j<=n+1;j++)a[i][j]^=a[l1][j];
        }
        for(int i=l1;i<=n;i++)
            if(a[i][n+1])return 0;
        return (1<<(n-l1+1));
    }
    int main()
    {
        scanf("%d",&t);
        while(t--)
        {
            memset(a,0,sizeof(a));
            scanf("%d",&n);
            for(int i=1;i<=n;i++)scanf("%d",&b[i]);
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&a[i][n+1]);
                a[i][n+1]^=b[i];
                a[i][i]=1;
            }
            int x,y;
            while(scanf("%d%d",&x,&y))
            {
                if(!x&&!y)break;
                a[y][x]=1;
            }
            int ans = gs();
            if(!ans)puts("Oh,it's impossible~!!");
            else printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    linux下创建和删除软、硬链接
    linux教程:[4]配置Tomcat开机启动
    Linux下Tomcat的启动、关闭、杀死进程
    Linux下Tomcat的安装配置
    Linux安装JDK详细步骤
    每天一个linux命令(30): chown命令
    linux系统修改系统时间与时区
    linux下tar.gz、tar、bz2、zip等解压缩、压缩命令小结
    linux下解压命令大全
    Scoped CSS规范草案
  • 原文地址:https://www.cnblogs.com/LiGuanlin1124/p/10473946.html
Copyright © 2011-2022 走看看