P3857 [TJOI2008]彩灯 线性基求可以异或出的数量
题意:给出m个开关,这m个开关可以控制这n盏灯
具体控制方式会再给出,题目中以OX方式来表示是否能控制第K盏灯
思路:题目中给出的n的范围是到50,也就是说,在LL的范围之内
我们把每一个开关控制的情况转换成数字,然后直接计算最多异或出来的数目
最后答案即为:2的(最多数目)的次方
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 char a[60][60]; 5 ll b[60]; 6 ll p[60]; 7 int num=0; 8 void Insert(ll k) { 9 for(ll i=55;i>=0;i--) { 10 if(!(k&(1LL<<i))) continue; 11 if(!p[i]){ 12 p[i]=k; 13 if(k!=0) //这里加没加这个条件都能ac,但是应该得加上才对 14 num++; 15 return; 16 } 17 k ^= p[i]; 18 } 19 } 20 int main() 21 { 22 int n,m; 23 scanf("%d%d",&n,&m); 24 for(int i=1;i<=m;i++){ 25 scanf("%s",a[i]+1); 26 } 27 for(int i=1;i<=m;i++){ 28 ll sum=0; 29 ll base=1; 30 for(int j=1;j<=n;j++){ 31 if(a[i][j]=='O') sum+=base; 32 base*=2; 33 } 34 b[i]=sum; 35 Insert(b[i]); 36 } 37 ll res=1; 38 for(int i=1;i<=num;i++){ 39 res=res*2%2008; 40 } 41 printf("%lld\n",res); 42 return 0; 43 }