首页 > 其他分享 >CF1119H Triple

CF1119H Triple

时间:2024-07-28 11:56:40浏览次数:8  
标签:wedge CF1119H text ll bitcnt Triple FWT mod

异或卷积,把一个三元组 \(\{a_i,b_i,c_i\}\) 转化为 \(F_i[a_i]=x\),\(F_i[b_i]=y\),\(F_i[c_i]=z\) 的幂级数,将 \(\prod\limits_{i=1}^n \text{FWT}(F_i)\) 执行 \(\text{IFWT}\) 即可

考虑从每个幂级数只有 \(3\) 个非零值入手优化,设 \(c(i,j)\) 表示异或卷积的变换系数,即 \(\text{FWT}(F_k)[i]=\sum\limits_{i=0}^{m-1} c(i,j) F_k[j]\),构造可得 \(c(i,j)=(-1)^{\text{bitcnt}(i \wedge j)}\),则 \(\text{FWT}(F_k)[i]\) \(=(-1)^{\text{bitcnt}(i\wedge a_k)}x+(-1)^{\text{bitcnt}(i\wedge b_k)}y+(-1)^{\text{bitcnt}(i\wedge c_k)}z\)

令 \(S_i=\prod\limits_{k=1}^n \text{FWT}(F_k)[i]\),考虑对每个 \(S_i\) 求出 \(\text{FWT}(F_k)[i]\) 后的乘积项 \(8\) 种情况的个数,此时利用异或的自反性化简问题,将每个三元组 \(\{a_i,b_i,c_i\}\) 异或 \(a_i\) 变为 \(\{0,a_i \oplus b_i,a_i\oplus c_i\}\),而最终结果的变化反映到幂级数上就是异或 \(\bigoplus\limits_{i=1}^n a_i\) 的下标映射,令 \(x+y+z\),\(x+y-z\),\(x-y+z\),\(x-y-z\) 这 \(4\) 种情况的方案数为 \(c_i\)

考虑列出 \(4\) 个方程求解 \(c_i\),显然 \(c_1+c_2+c_3+c_4=n\)

如果仅令 \(F_k[b_k]=1\),有 \(\text{FWT}(F_k)[i]=(-1)^{\text{bitcnt}(i \wedge b_k)}\),根据上式 \(y\) 的符号可得 \(\sum\limits_{i=1}^n \text{FWT}(F_k)[i]=c_1+c_2-c_3-c_4\),而 \(\text{FWT}\) 是线性变化,由 \(\text{FWT}(x+y)=\text{FWT}(x)+\text{FWT}(y)\) 可快速求得原式权值

同理仅令 \(F_k[c_k]=1\) 可得 \(c_1-c_2+c_3-c_4\) 的权值

如果仅令 \(F_k[b_k \oplus c_k]=1\),相当于将以上两种情况卷积,即 \(\text{FWT}(F_k)[i]=(-1)^{\text{bitcnt}(i \wedge b_k)}(-1)^{\text{bitcnt}(i \wedge c_k)}\),可得 \(c_1-c_2-c_3+c_4\) 的权值,解出后维护出 \(\text{IWFT}(S)\) 即可求出答案

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,a,b,c,w;
ll x,y,z,f[131072],g[131072],h[131072],s[131072];
const int mod=998244353,inv=mod+1>>1;
ll qpow(ll a,ll b){
	ll s=1;
	for(a=(a%mod+mod)%mod;b;b>>=1,a=a*a%mod) if(b&1) s=s*a%mod;
	return s;
}
void fwt(ll *f,ll c){
	for(int k=1;k<m;k<<=1){
		for(int i=0;i<m;i+=k+k){
			for(int j=i;j<i+k;j++){
				ll x=f[j],y=f[j+k];
				if(c) f[j]=x+y,f[j+k]=x-y;
				else f[j]=(x+y)*inv%mod,f[j+k]=(x-y+mod)*inv%mod;
			}
		}
	}
}
int main(){
	scanf("%d%d%lld%lld%lld",&n,&m,&x,&y,&z),m=1<<m;
	for(int i=1;i<=n;i++) scanf("%d%d%d",&a,&b,&c),w^=a,b^=a,c^=a,f[b]++,g[c]++,h[b^c]++;
	fwt(f,1),fwt(g,1),fwt(h,1);
	for(int i=0;i<m;i++){
		ll c=(n+f[i]+g[i]+h[i])/4;
		s[i]=qpow(x+y+z,c)*qpow(x+y-z,(n+f[i]-c*2)/2)%mod*qpow(x-y+z,(n+g[i]-c*2)/2)%mod*qpow(x-y-z,(n+h[i]-c*2)/2)%mod;
	}
	fwt(s,0);
	for(int i=0;i<m;i++) printf("%lld ",s[i^w]);
	return 0;
}

标签:wedge,CF1119H,text,ll,bitcnt,Triple,FWT,mod
From: https://www.cnblogs.com/zyxawa/p/18328058

相关文章

  • YOLOv10改进 | 注意力篇 | YOLOv10引入Triplet Attention注意力
    1. TripletAttention介绍1.1 摘要:由于注意机制能够在通道或空间位置之间建立相互依赖关系,因此近年来已被广泛研究并广泛应用于各种计算机视觉任务中。在本文中,我们调查重量轻,但有效的注意力机制,并提出三重注意力,一种新的方法来计算注意力的权重,通过捕获交叉维的相互作用,......
  • ICS TRIPLEX T8800C PD8800 PCB130100 数字输入模块
    T8800CPD8800PCB130100应用领域包括:化学工业纸张制造电力生成石油行业制造业电力行业化学行业等需要自动化控制的工业生产过程。T8800CPD8800PCB130100可以集成到自动化控制系统中,与其他设备和系统协同工作,以提高生产效率、降低能源消耗和减少劳动成本。它还可以设置每......
  • CF Div. 3 C Beautiful Triple Pairs
    原题链接标签组合数学(combinatorics)数据结构(datastructures)题目大意一个数组\(a\)。对于每个\(j\)(\(1\lej\len-2\))写出一个由\([a_j,a_{j+1},a_{j+2}]\)组成的三元组。满足以下条件之一,那么这对三元组就是美丽的:\(b_1\nec_1\)和\(b_2=c_2\)......
  • Java编程的利器:Pair和Triple无缝解决多值返回问题,助力编写高效代码
    在实际编码中,经常会遇到一个方法需要返回多个值的情况,你编写一个方法,需要同时返回某个操作的结果和一些相关的附加信息。使用传统的方式,你可能需要创建一个包含这些信息的自定义类或者使用集合(如Map)来存储这些值。然而,这往往使得代码变得臃肿,而且对于调用方来说,理解和提取这些值......
  • CF1408H Rainbow Triples 题解
    Description给定长度为\(n\)的序列\(p\)找出尽可能多的三元组\((a_i,b_i,c_i)\)满足:\(1\lea_i<b_i<c_i\len\)\(p_{a_i}=p_{c_i}=0\),\(p_{b_i}\ne0\)\(p_{b_i}\)互不相同。所有的\(a_i,b_i,c_i\)互不相同。输出最多可以选出多少个三元组,多组数据。\(\sumn\le......
  • Beaver triples/乘法三元组/乘法加密
    本文由BingAI/NewBing/Sydney根据这篇文章总结得出。首先,我们假设有两个参与方S1和S2,他们分别持有秘密值x和y的加法分享值x1和x2,y1和y2。也就是说,x=x1+x2,y=y1+y2。他们想要计算x和y的乘积,但是不想暴露自己的分享值。为了实现这个目的,他们需要在离线阶段预先生成一个......
  • CF1338C Perfect Triples 题解
    解题思路没什么好说的,就是打表找规律……表在这里不难发现,三元组中第一个数的最后两位按照\(00\to01\to10\to11\)的顺序变化,其他位也一样,同样,第二个数和第三个数中每两位分别按照\(00\to10\to11\to01\)和\(00\to11\to01\to10\)的顺序变化,且与第一个数对应变化......
  • QOJ7206 Triple
    QOJ传送门大分讨恶心题。首先施容斥,变成求\(\sum|AB|>\max(|AC|,|BC|)\)。遇到这种三个点的路径问题,可以找出一个点\(X\),使得\(A,B,C\)在\(X\)的不同子树内,也就是\(A\toB,A\toC,B\toC\)的路径的唯一一个交点\(X\)。那么:\[[|AB|>\max(|AC|,|BC|)]=......
  • [ARC155C] Even Sum Triplet 题解
    一道大分类讨论。如果有一个可以交换的段包含奇数,那么你可以把所有奇数移到最左边并任意调整相对顺序,然后回到任意一种有一个可以交换的段包含奇数的状态。这种情况,如果偶数的数量为\(2\),这两个偶数是不能交换相对位置的,有至少\(3\)个偶数就能交换偶数间相对位置。所以只需要......
  • TripleDES在java与c#中的区别
        C#下TripleDES默认支持16位和24位的秘钥,而Java下的DESedeKeySpec就只支持24位,其实怎么说呢,按3DES规范要求,的确其秘钥应该是24位而不是16位的,但16位秘钥可以按前8位+后8位+前8位的规则来升级成24位的秘钥,所以我们只需要简单的通过数组的Copy就可以将16位秘钥升级为24......