P3857-[TJOI2008]彩灯【线性基】

    科技2022-07-12  146

    正题

    题目链接:https://www.luogu.com.cn/problem/P3857


    题目大意

    n n n个彩灯, m m m个开关能使得某些彩灯取反,求有多少种彩灯样式。


    解题思路

    其实就是 m m m个数种若干个数异或起来有多少不同的数。

    又是一道考线性基性质的题目,因为线性基中任何一个数不为其他数的异或和。也就是在线性基中我们选出若干个数异或起来,选择方案不同结果必然不同。

    所以 s i z siz siz表示线性基大小的话,答案就是 2 s i z 2^{siz} 2siz


    c o d e code code

    #include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=80; ll n,m,ans,d[N]; char s[N]; void add(ll x){ for(ll i=n;i>=0;i--) if((x>>i)&1){ if(d[i])x^=d[i]; else{ ans++; d[i]=x; break; } } return; } int main() { scanf("%lld%lld",&n,&m); for(ll i=1;i<=m;i++){ ll x=0;scanf("%s",s); for(ll j=0;j<n;j++) x|=(s[j]=='O')*(1ll<<j); add(x); } printf("%lld",(1ll<<ans)%2008); }
    Processed: 0.011, SQL: 8