P3857 [TJOI2008]彩灯
【题意】
给定n个开关,每个开关可以控制一些灯,开始时灯全部是灭的,问通过按动开关,最多有多少种不同的灯的状态
【分析】
把每个开关看成二进制数,加入线性基,由于线性基异或的结果都不相同,所以我们只需要计算出线性基元素个数cnt,答案就是(1<<cnt)
【代码】
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=105; int n,m; ll a[maxn],p[maxn]; char s[maxn]; int main() { // freopen("a.in","r",stdin); // freopen("a.out","w",stdout); int sz=0; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%s",s); int len=strlen(s); for(int j=0;j<len;j++) if(s[j]=='O') a[i]+=(1LL<<(n-j)); } for(int i=1;i<=m;i++) for(int j=63;j>=0;j--) { if(!(a[i]&(1LL<<j))) continue; if(p[j]) a[i]^=p[j]; else { p[j]=a[i]; sz++; break; } } printf("%lld",(1LL<<sz)%2008); return 0; }