zoukankan      html  css  js  c++  java
  • 洛谷 P3857 彩灯 题解

    题面

    对于每一个开关,我们可以看成一个0/1串,初始是一个全部为0的串,要求经过这些开关的操作后,出现的不同的0/1串的个数

    建模就是存在一些数,这些数异或起来是0(等价于没有操作)。那么需要求一个集合,满足集合中元素相互异或不会出现0.

    线性基派上用场了。

    接下来就是线性基的基本插入操作和统计一下线性基里的元素个数;

    性基内的元素都是由外界元素异或出来的,那么对于线性基内每个元素,我们都有选/不选两种情况,所以ans=1<<cnt

    #include <bits/stdc++.h>
    #define int long long
    using namespace std;
    char s[10010];
    long long a[10010];
    long long p[10010];
    int n,m;
    signed main()
    {    
        cin>>n>>m;
        for(int i=1;i<=m;i++){
            scanf("%s",s);
            for(int j=0;j<n;j++){
                if(s[j]=='O'){
                    a[i]^=(1ll<<j);
                }
            }
        }
        for(int i=1;i<=m;i++){
            for(int j=62;j>=0;j--){
                if((a[i]>>j)&1){
                    if(p[j]==0){
                        p[j]=a[i];
                        break;
                    }
                    else{
                        a[i]^=p[j];
                    }    
                }
            }
        }
        int cnt=0;
        for(int i=0;i<=62;i++){
            if(p[i]) ++cnt;
        }
        printf("%lld",(1ll<<cnt)%2008);
    }
  • 相关阅读:
    python高级之操作数据库
    算法之矩阵计算斐波那契数列
    Mysql操作初级
    python高级之生成器&迭代器
    python高级之装饰器
    python高级之多进程
    python高级之多线程
    操作系统IO模型
    python高级之网络编程
    python高级之面向对象高级
  • 原文地址:https://www.cnblogs.com/kamimxr/p/11492797.html
Copyright © 2011-2022 走看看