【题解】 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(){
  char ch=getchar();LL re=0;
  while(ch!='O'&&ch!='X')ch=getchar();
  while(ch=='O'||ch=='X'){
    if(ch=='O')re=((re<<1)^1);
    if(ch=='X')re=(re<<1);
    ch=getchar();
  }return re;
}
bool push(LL ss){
  for(int i=63;i>=0;i--){
    if((ss>>i)&1){
      if(!x[i]){x[i]=ss;return true;}
      else ss=(ss^x[i]);
    }
  }return false;
}
LL q_pow(LL x,LL t){
  LL re=1;
  while(t){
    if(t%2){re=(re*x%MOD);}
    x=x*x%MOD;
    t=t/2;
  }return re;
}
int main(){
  scanf("%d%d",&n,&m);
  for(int i=1;i<=m;i++){
    s[i]=read();//cout<<i<<' '<<s[i]<<endl;
  }
  for(int i=1;i<=m;i++){
    if(push(s[i]))ans++;
  }
  printf("%lld\n",q_pow(2,ans));
  return 0;
}

博主蒟蒻,随意转载。但必须附上原文链接:http://www.cnblogs.com/Ning-Mew/,否则你会终生找不到妹子!!!

原文地址:https://www.cnblogs.com/Ning-Mew/p/9113552.html

时间: 2024-08-30 16:36:31

【题解】 luogu 3857 [TJOI2008]彩灯 (线性基)的相关文章

[TJOI2008] 彩灯 (线性基)

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

题解 外星千足虫(线性基+高斯消元)

题解 luogu外星千足虫(线性基+高斯消元) 题目 luogu题目传送门 题解想法 首先需要知道这是个异或方程对吧 然后既然看到位运算,又有这么多,就可以考虑线性基(做题技巧),那我们就丢进去 接下来看一看线性基,哇,性质美妙 它不就是Gauss消元里面想要的上三角矩阵吗 所以说: 如果能拼成线性基,那么枚举到哪里完成了,就输出位置(first_ans) 如果拼不成,那就解不出(毋庸置疑) 那真是美妙啊... 所以怎么消元呢?这可是个异或方程,我们要解出来啊 枚举整个线性基的g[i] 如果g[

【bzoj4269】再见Xor 高斯消元求线性基

题目描述 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. 输入 第一行一个正整数N. 接下来一行N个非负整数. 输出 一行,包含两个数,最大值和次大值. 样例输入 3 3 5 6 样例输出 6 5 题解 高斯消元求线性基裸题 由于线性基可以表示所有能够求出的异或和,所以我们只需要考虑线性基即可. 先求出线性基,然后按照从高位到低位的贪心思想来选择. 由于每个线性基的最高位在之前都没有出现过,所以每次选择一定会使答案增大,故直接

【HDU3949】XOR 线性基

#include <stdio.h> int main() { puts("转载请注明出处谢谢"); puts("http://blog.csdn.net/vmurder/article/details/43448493"); } 题意:给若干个数让你异或,然后询问第k大的异或和. 题解: 先搞出来线性基,然后第k大的异或和就是: 把k二进制拆分,第i位上有1,就把第i个线性基异或进来. 原因: 因为线性基是一堆高位上的1(或许有一些位动不了),然后把这

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

【题解】魔改版线性基

[题解]魔改版线性基 魔改版线性基解决此类问题. 联系线性空间的性质,我们直接可以构造出这样的基: \[ 100000 \010000 \000010 \000001 \] 使得每个基的最高位是唯一的,我们的目的是要能够保证从上往下一直异或一直变大,所以不能使基出现这样的情况: \[ 100001 \000001 \] 一个不能从上往下一直异或一直变大的例子. 考虑如何构造\(kth\) 大(小),考虑这样的性质,我们记\(a_i\)表示从下往上第\(i\)个基,显然从\(0\)开始,如果我们异

【题解】 bzoj2460: [BeiJing2011]元素 (线性基)

bzoj2460,戳我戳我 Solution: 线性基板子,没啥好说的,注意long long 就好了 Code: //It is coded by Ning_Mew on 5.29 #include<bits/stdc++.h> #define LL long long using namespace std; const int maxn=1007; int n; LL A[maxn]; struct Node{ LL num;int val; }s[maxn]; LL ans=0; bo

【题解】 bzoj1923: [Sdoi2010]外星千足虫 (线性基/高斯消元)

bzoj1923,戳我戳我 Solution: 这个高斯消元/线性基很好看出来,主要是判断在第K 次统计结束后就可以确定唯一解的地方和\(bitset\)的骚操作 (我用的线性基)判断位置,我们可以每次加入一个线性基时判断是不是全被异或掉了,如果没有,说明这个方程不是冗余的,那么我们可记录非冗余方程个数 如果非冗余方程个数小于\(n\),那就是个不定方程组,有无数种解,否则,在个数第一次达到\(n\)时,就可输出当时输入方程的号码 还有一个点就是压空间与时间,这题主要是时间,用到大杀器\(bit

P4151 最大XOR和路径 线性基

题解见:https://www.luogu.org/problemnew/solution/P4151 其实就是找出所有环 把环上所有边异或起来得到的值扔到线性基里面 然后随便走一条从1~n的链 最后求最大异或和即可 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define LL long long LL