洛谷3857 [TJOI2008]彩灯
題目描述
已知一組彩燈是由一排N個獨立的燈泡構成的,并且有M個開關控制它們。從數學的角度看,這一排彩燈的任何一個彩燈只有亮與不亮兩個狀態,所以共有2N個樣式。由于技術上的問題,Peter設計的每個開關控制的彩燈沒有什么規律,當一個開關被按下的時候,它會把所有它控制的彩燈改變狀態(即亮變成不亮,不亮變成亮)。假如告訴你他設計的每個開關所控制的彩燈范圍,你能否幫他計算出這些彩燈有多少種樣式可以展示給他的女朋友?
注: 開始時所有彩燈都是不亮的狀態。
輸入輸出格式
輸入格式:
每組測試數據第一行為兩個整數N和M,用空格隔開。緊接著是有M行,每行都是一個長度為N的字符串,表示一個開關控制彩燈的范圍(N盞燈),如果第i個字母是大寫字母’O’,則表示這個開關控制第i盞燈,如果第i個字母是大寫字母’X’,則表示這個開關不控制此燈。
輸出格式:
輸出這些開關和彩燈可以變換出來的樣式數目。由于這個值可能會很大,請求出它對于整數2008的余數。
輸入輸出樣例
輸入樣例#1:2 3 OO XO OX 輸出樣例#1:
4
說明
可見樣例中第一個開關控制了所有的彩燈,而后兩個開關分別控制了第一個和第二個彩燈,這樣我們可以只用后兩個開關控制彩燈,可以變換出來所有的22個狀態。
30%的數據中,N和M不超過15。
70%的數據中,N和M不超過50。
?
本題可以翻譯成給出M個N位二進制數 , 取若干個異或,求有多少種結果。
本質就是求出線性基的個數x,結果即為2^x
線性基就是把原有的集合用一個新的集合替代之,新的集合里面數相互異或可以得出原有集合的數相互異或的答案。
搞出線性基的性質 : a 和 b 的所有xor 結果 等同于 a和 a xor b的所有結果
代碼
#include<bits/stdc++.h> using namespace std; int N,M,cnt,ans; long long P[128]; char s[128]; void insert(long long x) {for(int i=62;i>=0;i--)if((x>>i)&1){if(!P[i]){P[i]=x;break;}else x^=P[i];} } int main() {scanf("%d%d",&N,&M);for(int i=1;i<=M;i++){scanf("%s",s);long long a=0;for(int j=0;j<N;j++)if(s[j]=='O')a^=(1ll<<j);insert(a);}for(int i=0;i<=62;i++)if(P[i])ans++;printf("%lld",(1ll<<ans)%2008);return 0; }?
轉載于:https://www.cnblogs.com/Elfish/p/7649059.html
總結
以上是生活随笔為你收集整理的洛谷3857 [TJOI2008]彩灯的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 测试服务搭建之centos7下安装jav
- 下一篇: Java中集合删除元素时候关于Concu