首页 > 其他分享 >[BZOJ4671] 异或图 题解

[BZOJ4671] 异或图 题解

时间:2025-01-23 12:11:07浏览次数:1  
标签:连通 return int 题解 BZOJ4671 len 异或 num

我能说什么!抽象了这!


看到 \(n\le 10\) 的黑题顿感大事不妙。

我们考虑设 \(f(i)\) 表示将 \(n\) 个点划分为至少 \(i\) 个连通块时的方案数。我们可以暴力枚举每个点在哪个连通块里。划分方案是 \(Bell(n)\le 21147\) 的。

显然的,相同块内暂时忽略,不同块间不能有边。于是我们将每张图的新边集定为这张图中所有的违法边。当一些新边集异或和为 \(0\) 时,表明我们找到了一个合法解。直接线性基加新边集。若向线性基中成功加入了 \(k\) 个新边集,那么对答案的贡献就是 \(2^{s-k}\)。这一部分的时间复杂度为 \(O(Bell(n)sn^2)\),注意卡常。

设 \(g(i)\) 表示 \(n\) 个点恰好划分成 \(i\) 个连通块时的方案数,那么我们可以将 \(i\) 个连通块放入 \(j\) 个集合中,每个集合再形成一个假连通块。这实际上就是 \(g(i)\) 对 \(f(j)\) 的贡献。将其表示为等式,即为:

\[f(m)=\sum_{i=m}^n\begin{Bmatrix}i\\m\end{Bmatrix}g(i) \]

可以直接高斯消元,也可以根据斯特林反演,得到:

\[g(1)=\sum_{i=1}^n(-1)^{i-1}\begin{bmatrix}i\\1\end{bmatrix}f(i) \]

\[=\sum_{i=1}^n(-1)^{i-1}(i-1)!f(i) \]

总体时间复杂度 \(O(Bell(n)sn^2)\)。

#include<bits/stdc++.h>
#define bi(x) x==1?2:x==3?3:x==6?4:x==10?5:x==15?6:x==21?7:x==28?8:x==36?9:10
#define int long long
using namespace std;
int t,n,len,a[15],num[50],f[15],sm[65];
int vs[65][50],tw[65];string s;
int add(int x){
    for(int i=len-1;~i;--i){
        if(!((x>>i)&1)) continue;
        if(num[i]) x^=num[i];
        else return num[i]=x,1;
    }return 0;
}void check(int x){
    int tot=0;
    for(int i=0;i<len;++i) num[i]=0;
    for(int j=1,k=0;j<=n;++j)
        for(int l=j+1;l<=n;++l,++k) if(a[j]^a[l])
            for(int i=1;i<=t;++i) sm[i]|=(vs[i][k]<<k);
    for(int i=1;i<=t;i++) tot+=(!add(sm[i])),sm[i]=0;
    f[x]+=tw[tot];
}void dfs(int x,int y){
    if(x>n) return check(y);
    for(a[x]=1;a[x]<=y;++a[x]) dfs(x+1,y);
    dfs(x+1,y+1);
}signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>t,tw[0]=1;
    for(int i=1;i<=60;++i) tw[i]=tw[i-1]*2;
    for(int i=1;i<=t;++i){
        cin>>s;
        if(!n) len=s.size(),n=bi(len);
        for(int j=0;j<len;++j)
            vs[i][j]=s[j]-'0';
    }dfs(1,0);int ans=0,jc=1;
    for(int i=1;i<=n;++i)
        ans+=((i&1)?1:-1)*jc*f[i],jc*=i;
    cout<<ans;
    return 0;
}

标签:连通,return,int,题解,BZOJ4671,len,异或,num
From: https://www.cnblogs.com/chang-an-22-lyh/p/18687493/bzoj4671-yi_huo_tu-tj

相关文章

  • [BZOJ3622] 已经没有什么好害怕的了 题解
    发现难以维护差值,于是令\(K=\frac{n+k}2\),这样就把问题转化为了“糖果”比“药片”大的组数为\(K\)的情况有多少种。设\(dp_{i,j}\)表示我们用前\(i\)个“糖果”和“药片”配对,至少有\(j\)组“糖果”比“药片”大,有多少种情况;\(c_i\)表示有多少个“药片”比第\(i\)个......
  • [BZOJ3622] 已经没有什么好害怕的了 题解
    发现难以维护差值,于是令\(K=\frac{n+k}2\),这样就把问题转化为了“糖果”比“药片”大的组数为\(K\)的情况有多少种。设\(dp_{i,j}\)表示我们用前\(i\)个“糖果”和“药片”配对,至少有\(j\)组“糖果”比“药片”大,有多少种情况;\(c_i\)表示有多少个“药片”比第\(i\)个......
  • [BZOJ4665] 小w的喜糖 题解
    我们先假设同种糖间存在差异。设\(f_{i,j}\)表示前\(i\)种糖至少有\(j\)人拿到的糖和原来一样,\(c_i\)表示拿第\(i\)种糖的人的个数,则有:\[f_{i,j}=\sum_{k=0}^{\min(j,c_i)}f_{i-1,j-k}\binom{c_i}kc_i^\underlinek\]设\(g_i\)表示所有人中恰好有\(i\)人拿到的糖......
  • [FJOI2016] 建筑师 题解
    显然有一个\(dp\)思路。设\(f_{i,j}\)表示现在修了\(i\)栋楼,从第一栋楼外侧能看到\(j\)栋楼的方案数,显然有:\[f_{i,j}=\begin{cases}[i=0](j=0)\\f_{i-1,j-1}+(i-1)f_{i-1,j}(j\ne0)\end{cases}\]一眼\(f_{i,j}=\begin{bmatrix}i\\j\end{bmatrix}\)。那么答案即为:\[\s......
  • [BZOJ5093] 图的价值 题解
    考虑计算一个点的贡献,最后\(\timesn\)即为所求。显然一个点的贡献为\(\sum\limits_{i=0}^{n-1}\binom{n-1}ii^k2^{\frac{(n-1)(n-2)}2}\),则有:\[\sum_{i=0}^{n-1}\binom{n-1}ii^k2^{\frac{(n-1)(n-2)}2}=2^{\frac{(n-1)(n-2)}2}\sum_{i=0}^{n-1}\sum_{j=0}^k\begin{Bmatrix}k......
  • [TJOI/HEOI2016] 求和 题解
    为什么又是佳媛姐姐啊啊啊!斯特林数在这道题中不好处理,直接拆开:\[f(n)=\sum_{i=0}^n\sum_{j=0}^i\begin{Bmatrix}i\\j\end{Bmatrix}2^jj!\]\[=\sum_{j=0}^n2^jj!\sum_{i=0}^n\sum_{k=0}^j\frac{(-1)^k(j-k)^i}{k!(j-k)!}\]\[=\sum_{j=0}^n2^jj!\sum_{k=0}^j\frac{(-1)^k\sum\l......
  • [联合省选 2020A] 组合数问题 题解
    后面有一只大大的组合数,考虑下降幂干过去。\(x^k\)并不好使,这边考虑转化\(f(x)=\suma_ix^i=\sumb_ix^\underlinei\)。\[\sum_{k=0}^nf(k)x^k\binomnk=\sum_{k=0}^nx^k\sum_{i=0}^mb_ik^\underlinei\binomnk\]\[=\sum_{k=0}^nx^k\sum_{i=0}^mb_in^\underlinei\binom{n-i......
  • Bear and Bad Powers of 42 题解
    题目描述定义一个正整数是坏的,当且仅当它是\(42\)的幂次,否则它是好的。给定长为\(n\)的序列\(a_i\),保证初始所有数都是好的。接下来\(q\)次操作:1i:查询\(a_i\)。2lrx:将\(a_l,\cdots,a_r\)赋值为一个好的数\(x\)。3lrx:将\(a_l,\cdots,a_r\)加上\(......
  • [ARC178C] Sum of Abs 2 题解
    首先想到能不能用差分搞搞,但是给自己绕进去了/kel我们不妨给\(\{b_L\}\)定个不降的序(如果打在数轴上,显然序和答案无关),于是可以拿掉绝对值。注意到这个和式(记其结果为\(x\))中每个\(b_i\)的贡献系数\(c_i=2i-L-1\),于是有:\[x=\sum_{i=1}^{L}b_ic_i\]直接做不......
  • CF2061G Kevin and Teams 题解
    题目描述这是一道交互题。\(T\)组数据,一张\(n\)个点的无向完全图,边权\(\in\{0,1\}\),边权未知。你需要先输出最大的\(k\),满足无论每条边的边权是什么,都能找出\(2k\)个不同的点\(\{u_1,\cdots,u_n,v_1,\cdots,v_n\}\),使得边\((u_i,v_i)\)的权值同时为\(0\)或同时......