luogu 3857 [TJOI2008]彩灯 线性基
可以将每一个开关控制的灯的序列看作是0/1组成的二进制.
由于灯的开和关是满足异或的性质的,所以直接求一下线性基大小即可.
答案为 $2^{size}.$
#include <cstdio> #include <cstring> #include <algorithm> #define N 62 #define M 62 #define ll long long #define setIO(s) freopen(s".in","r",stdin) using namespace std; int n,m; ll d[N<<1]; char str[N]; void insert(ll x) { int i; for(i=M;i>=0;--i) { if(x&(1ll<<i)) { if(d[i]) x^=d[i]; else { d[i]=x; break; } } } } int main() { int i,j; // setIO("input"); scanf("%d%d",&m,&n); for(i=1;i<=n;++i) { scanf("%s",str); ll num=0; int length=strlen(str); for(j=0;j<length;++j) { if(str[j]=='O') { num+=(1ll<<(length-j-1)); } } insert(num); } int ans=0; for(i=M;i>=0;--i) if(d[i]) ++ans; printf("%d\n",(1ll<<ans)%2008); return 0; }