P3857 [TJOI2008] 彩灯
P3857 [TJOI2008] 彩灯
题目描述
Peter 女朋友的生日快到了,他亲自设计了一组彩灯,想给女朋友一个惊喜。已知一组彩灯是由一排
注: 开始时所有彩灯都是不亮的状态。
输入格式
每组测试数据第一行为两个整数 O
,则表示这个开关控制第 X
,则表示这个开关不控制此灯。
输出格式
输出这些开关和彩灯可以变换出来的样式数目。由于这个值可能会很大,请求出它对于整数
数据范围
对于
说句闲话
Starbucks 实在是有点吵,只能来写一下很久之前的解题报告了,突然发现我的解题报告系列里面竟然没有线性基?这是不好的(’へ’)。
Solution:
我们认为你已经学过了线性基,我们发现每一个开关其实就对应一个数字,然后我们只关心线性基上有多少个
答案就是2的是
Code:
#include<bits/stdc++.h> #define int long long using namespace std; const int N=1e5+5; const int inf=70; const int mod=2008; struct Node { int y; bool operator <(const Node &n1)const{ return y>n1.y; } }e[N]; int n,m,ans; int base[inf]; char c[inf]; void ins() { int x=0; for(int i=1;i<=n;i++) { x<<=1; x+=(c[i]=='O'); } for(int i=n;i>=0;i--) { if(x&(1ll<<i)) { if(!base[i]) { base[i]=x; ans++; break; } x^=base[i]; } } } void work() { //freopen("1.in","r",stdin); cin>>n>>m; for(int i=1;i<=n;i++) { scanf("%s",c+1); ins(); } int sum=(1ll<<ans)%mod; printf("%lld",sum); } #undef int int main() { work(); }