[TJOI2008]彩灯

题目描述

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

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

输入格式

每组测试数据第一行为两个整数N和M,用空格隔开。紧接着是有M行,每行都是一个长度为N的字符串,表示一个开关控制彩灯的范围(N盏灯),如果第i个字母是大写字母’O’,则表示这个开关控制第i盏灯,如果第i个字母是大写字母’X’,则表示这个开关不控制此灯。

输出格式

输出这些开关和彩灯可以变换出来的样式数目。由于这个值可能会很大,请求出它对于整数2008的余数。

输入输出样例

输入 #1复制

2 3
OO
XO
OX

输出 #1复制

4

说明/提示

可见样例中第一个开关控制了所有的彩灯,而后两个开关分别控制了第一个和第二个彩灯,这样我们可以只用后两个开关控制彩灯,可以变换出来所有的22个状态。

30%的数据中,N和M不超过15。

另外有40%的数据中,N和M有一个为50

100%的数据中,N和M不超过50。

题目问的就是在所有01串中任选起来异或,一共能得到多少不同的结果

构造线性基,因为把原先数字选出来异或可以看作在线性基里选数字出来异或

而线性基里的数字满足只要选择不同则结果不同的性质,方便计算

如果线性基里有$x$个数字,则答案为$2^x$

注意取模

#include <string>
#include <iostream>
using namespace std;
typedef long long ll;
string s;
ll p[70] = {0};
int main(){
    int n, m;
    cin >> n >> m;
    ll x;
    while(m--){
        cin >> s;
        x = 0;
        for(int i = 0; i < n; i++){
            x |= (ll)(s[i] == ‘O‘) << i;
        }
        for(int j = 60; ~j; j--){
            if(x & 1LL << j){
                if(p[j]){
                    x ^= p[j];
                }
                else{
                    p[j] = x;
                    break;
                }
            }
        }
    }
    int tot = 0;
    for(int j = 60; ~j; j--){
        if(p[j]){
            tot++;
        }
    }
    cout << (1LL << tot) % 2008 << endl;
    return 0;
}

原文地址:https://www.cnblogs.com/ruoruoruo/p/11621997.html

时间: 2024-11-09 03:48:22

[TJOI2008]彩灯的相关文章

[TJOI2008] 彩灯 (线性基)

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

【题解】 luogu 3857 [TJOI2008]彩灯 (线性基)

luogu3857,懒得复制 Solution: 裸的线性基,往里面添加数,记录添加个数\(sum\),快速幂输出\(2^{sum}\)即可 Code: //It is coded by Ning_Mew on 5.30 #include<bits/stdc++.h> #define LL long long using namespace std; const int maxn=70,MOD=2008; int n,m; LL s[maxn],x[maxn],ans=0; LL read()

P3857 [TJOI2008]彩灯(线性基)

题目链接:https://www.luogu.org/problem/P3857 解题报告: 给出一个序列,让你求出异或后有多少种可能的情况. 将给的数插入到线性基中,最后答案即为$(1LL<<res)%2008$,res为线性基的种类数. AC代码: 1 #include<vector> 2 #include<cstdio> 3 #include<iostream> 4 #include<cmath> 5 #include<queue&g

csu 1770按钮控制彩灯实验(树状数组)

1770: 按钮控制彩灯实验 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 194  Solved: 65[Submit][Status][Web Board] Description 应 教学安排,yy又去开心的做电学实验了.实验的内容分外的简单一串按钮通过编程了的EEPROM可以控制一串彩灯.然而选择了最low的一种一对一的控制 模式,并很快按照实验指导书做完实验的yy马上感觉到十分无趣.于是他手指在一排按钮上无聊的滑来滑去,对应的彩灯也不断的

csu 1770: 按钮控制彩灯实验

1770: 按钮控制彩灯实验 Submit Page   Summary   Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 341     Solved: 127 Description 应教学安排,yy又去开心的做电学实验了.实验的内容分外的简单一串按钮通过编程了的EEPROM可以控制一串彩灯.然而选择了最low的一种一对一的控制模式,并很快按照实验指导书做完实验的yy马上感觉到十分无趣.于是他手指在一排按钮上无聊的滑来滑去

【luogu3856】【TJOI2008】公共子串 [动态规划]

[TJOI2008]公共子串 f[i][j][k]表示a数组前i个值 b数组前j个值 c数组前k个值中的本质不同的公共字串有多少个 N3  每次都重新计算 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define rg register 4 const int N=100+5,inf=0x3f3f3f3f; 5 int n=0,la,lb,lc; 6 char a[N],b[N],c[N]; 7 long long las[4]['z

用RGB彩灯显示彩虹

int redPin = 11; int greenPin = 10; int bluePin = 9; void setup() { pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); } void loop() { RGB(255,0,0); delay(1000); RGB(255,50,0); delay(1000); RGB(255,150,0); delay(1000); RGB(

(2)小彩灯接收数据解析

const size_t t_bright=1,t_color=2,t_frequency=3,t_switch=4; int red = 0,green = 0,blue = 0; int type = 2;//当前模式 1亮度 2颜色 3呼吸 4开关 /**      * @Desc 解析json      * 有三种      * 1.亮度控制页面(0 暗 1正常 2亮)      * {      *     "t": 1,      *     "bb":

Arduino读取温湿度dh11+烟雾气体MQ2+彩灯ws2812

1获取温湿度 D4-x信号线 #include <TroykaDHT.h> // типы сенсоров: DHT11, DHT21, DHT22 DHT dht(4, DHT11); void setup() { Serial.begin(9600); dht.begin(); } void loop() { dht.read(); if(dht.getState()==DHT_OK) { String msg=String("")+String("Temp