ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF1119H-Triple【FWT】

2021-01-06 17:59:54  阅读:240  来源: 互联网

标签:cnt CF1119H ll a3 a2 a4 Triple FWT


正题

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


题目大意

n n n个可重集,第 i i i个里有 x x x个 a i a_i ai​, y y y个 b i b_i bi​, z z z个 c i c_i ci​。

对于每个 t ∈ [ 0 , 2 k ) t\in[0,2^k) t∈[0,2k)求每个集合里取出一个数使它们异或起来等于 t t t的方案数。


解题思路

如果直接 n n n个东西 F W T FWT FWT起来肯定过不了,我们需要根据每个集合里只有三种数这个性质来优化。

因为是 x o r xor xor卷积,所以第 i i i个位置 F W T FWT FWT之后对 j j j造成的影响是 ( − 1 ) c n t ( i & j ) (-1)^{cnt(i\&j)} (−1)cnt(i&j)(其中 c n t ( x ) cnt(x) cnt(x)表示 x x x在二进制下 1 1 1的个数)

那么就有
F W T ( S i ) = ∑ i = 1 2 k − 1 ( − 1 ) c n t ( j & a i ) x + ( − 1 ) c n t ( j & b i ) y + ( − 1 ) c n t ( j & b i ) z FWT(S_i)=\sum_{i=1}^{2^k-1}(-1)^{cnt(j\&a_i)}x+(-1)^{cnt(j\& b_i)}y+(-1)^{cnt(j\&b_i)}z FWT(Si​)=i=1∑2k−1​(−1)cnt(j&ai​)x+(−1)cnt(j&bi​)y+(−1)cnt(j&bi​)z
现在我们就可以单独考虑每个 x , y , z x,y,z x,y,z的贡献了,然后每个 F W T ( S i ) [ j ] FWT(S_i)[j] FWT(Si​)[j]有 8 8 8个状态,为了方便我们缩减一下状态先。

首先我们先让所有的 x x x都取到,也就是让所有的 b i = b i   x o r   a i , c i = c i   x o r   a i b_i=b_i\ xor\ a_i,c_i=c_i\ xor\ a_i bi​=bi​ xor ai​,ci​=ci​ xor ai​,然后询问答案的时候我们再异或上一个 a a a的异或和即可。

现在每个 F W T ( S i ) [ j ] FWT(S_i)[j] FWT(Si​)[j]有 4 4 4种状态,分别是 ( x + y + z ) , ( x + y − z ) , ( x − y + z ) , ( x − y − z ) (x+y+z),(x+y-z),(x-y+z),(x-y-z) (x+y+z),(x+y−z),(x−y+z),(x−y−z)。定义这些状态数量分别为 a 1 , a 2 , a 3 , a 4 a_1,a_2,a_3,a_4 a1​,a2​,a3​,a4​

我们先考虑集合 i i i的每种状态中 y y y的影响 F i F_i Fi​,有 F i [ k ] = c n t ( k & a i ) F_i[k]=cnt(k\& a_i) Fi​[k]=cnt(k&ai​),而所有集合的影响和就是 ∑ i = 1 n F i \sum_{i=1}^nF_i ∑i=1n​Fi​。设 G i = I F W T ( F i ) G_i=IFWT(F_i) Gi​=IFWT(Fi​)那么显然有 G i [ b i ] = 1 G_i[b_i]=1 Gi​[bi​]=1其他都为 0 0 0。

然后影响和就是 ∑ i = 1 n F W T ( G i ) = F W T ( ∑ i = 1 n G i ) \sum_{i=1}^nFWT(G_i)=FWT(\sum_{i=1}^nG_i) i=1∑n​FWT(Gi​)=FWT(i=1∑n​Gi​)
所以直接把 G G G都加起来然后 F W T FWT FWT就好了,定义 y y y的影响为 c 1 c_1 c1​。

然后再同理搞出 z z z和 y + z y+z y+z的影响,分别为 c 2 , c 3 c_2,c_3 c2​,c3​,那么就有方程组
{ a 1 + a 2 + a 3 + a 4 = n a 1 + a 2 − a 3 − a 4 = c 1 a 1 − a 2 + a 3 − a 4 = c 2 a 1 − a 2 − a 3 + a 4 = c 3 \left\{\begin{matrix} a_1+a_2+a_3+a_4=n\\ a_1+a_2-a_3-a_4=c_1\\ a_1-a_2+a_3-a_4=c_2\\ a_1-a_2-a_3+a_4=c_3 \end{matrix}\right. ⎩⎪⎪⎨⎪⎪⎧​a1​+a2​+a3​+a4​=na1​+a2​−a3​−a4​=c1​a1​−a2​+a3​−a4​=c2​a1​−a2​−a3​+a4​=c3​​
解出来就好了,然后用快速幂算出来 F = ∏ i = 1 n F W T ( S i ) F=\prod_{i=1}^nFWT(S_i) F=∏i=1n​FWT(Si​),求一遍 I F W T ( F ) IFWT(F) IFWT(F)即可。

时间复杂度 O (   2 k k + n log ⁡ ( x + y + z )   ) O(\ 2^kk+n\log(x+y+z)\ ) O( 2kk+nlog(x+y+z) )


c o d e code code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=2e5+10,P=998244353;
const ll inv2=(P+1)/2;
ll n,k,x,y,z,xs;
ll f1[N],f2[N],f3[N],f[N];
ll power(ll x,ll b){
    ll ans=1;x%=P;
    while(b){
        if(b&1)ans=ans*x%P;
        x=x*x%P;b>>=1;
    }
    return ans;
}
void FWT(ll *f,ll n,ll op){
    for(ll p=2;p<=n;p<<=1)
        for(ll k=0,len=p>>1;k<n;k+=p)
            for(ll i=k;i<k+len;i++){
                ll x=f[i],y=f[i+len];
                if(op==1){
                    f[i]=x+y;
                    f[i+len]=x-y;
                }
                else{
                    f[i]=(x+y)*inv2%P;
                    f[i+len]=(x-y)*inv2%P;
                }
            }
    return;
}
signed main()
{
    scanf("%lld%lld",&n,&k);k=1<<k;
    scanf("%lld%lld%lld",&x,&y,&z);
    for(ll i=1;i<=n;i++){
        ll a,b,c;
        scanf("%lld%lld%lld",&a,&b,&c);
        xs^=a;b^=a;c^=a;
        f1[b]++;f2[c]++;f3[b^c]++;
    }
    FWT(f1,k,1);FWT(f2,k,1);FWT(f3,k,1);
    for(ll i=0;i<k;i++){
        ll c1=f1[i],c2=f2[i],c3=f3[i];
        ll a1,a2,a3,a4;
        a4=(c3-c1-c2+n)/4;
        a3=-(c1-n+2ll*a4)/2;
        a2=-(c2-n+2ll*a4)/2;
        a1=n-a2-a3-a4;
        f[i]=power(x+y+z,a1)%P*power(x+y-z,a2)%P;
        f[i]=f[i]*power(x-y+z,a3)%P*power(x-y-z,a4)%P;
    }
    FWT(f,k,-1);
    for(ll i=0;i<k;i++)
        printf("%lld ",(f[i^xs]+P)%P);
    return 0;
}

标签:cnt,CF1119H,ll,a3,a2,a4,Triple,FWT
来源: https://blog.csdn.net/Mr_wuyongcong/article/details/112283847

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有