TJOI2008 彩灯

TJOI2008 彩灯

1 题目描述

  • Peter 女朋友的生日快到了,他亲自设计了一组彩灯,想给女朋友一个惊喜。已知一组彩灯是由一排 NN 个独立的灯泡构成的,并且有 MM 个开关控制它们。从数学的角度看,这一排彩灯的任何一个彩灯只有亮与不亮两个状态,所以共有 \(2^N\)个样式。由于技术上的问题,Peter 设计的每个开关控制的彩灯没有什么规律,当一个开关被按下的时候,它会把所有它控制的彩灯改变状态(即亮变成不亮,不亮变成亮)。假如告诉你他设计的每个开关所控制的彩灯范围,你能否帮他计算出这些彩灯有多少种样式可以展示给他的女朋友?

    注: 开始时所有彩灯都是不亮的状态。

2 分析

  • 这是一题很明显的线性基,因为线性基可以求出原序列中的任意表示,所以我们只要直接求线性基就可以了。

3 代码

#include<bits/stdc++.h>
using namespace std;  
#define N 51
#define mod 2008
#define ll long long 
int n,m,sum;  
ll d[N]; 
int ins(ll x){
    for(int i=n-1;i>=0;i--)
        if(x&(1LL<<i)){
            if(d[i]) x^=d[i]; 
            else {
                d[i]=x; 
                return 1; 
            }
        }
    return 0; 
}
int main(){
    scanf("%d%d",&n,&m);  
    while (m--){
        string s;  
        ll x=0;  
        cin>>s; 
        for(int i=0;i<s.length();i++)  
            if(s[i]=='O') 
                x^=(1LL<<i);  
        if(ins(x)) sum++; 
    }
    cout<<(1LL<<sum)%mod<<endl;  
    return 0; 
}
posted @ 2020-06-10 11:14  zjxxcn  阅读(143)  评论(0编辑  收藏  举报