CF1119H Triple 题解
Coffee_zzz · · 题解
不妨将三元组推广至更一般的情况:给出
令
由于
接下来,我们对于每一位
设
考虑
于是我们可以把
容易发现这其实就是对
时间复杂度
const int N=1e5+5,K=1<<17,P=3,M=1<<3,mod=998244353,inv=(mod+1)/2;
int n,m,k,kk,d[P],a[N][P],z[M][N],c[N],h[M][K],g[K],w[M];
int ad(int a,int b){
a+=b;
if(a>=mod) a-=mod;
return a;
}
void add(int &a,int b){
a+=b;
if(a>=mod) a-=mod;
}
int ksm(int a,int b){
int res=1;
while(b){
if(b&1) res=1ll*res*a%mod;
a=1ll*a*a%mod;
b>>=1;
}
return res;
}
void FWT(int *f,int V,int c){
for(int i=1;i<V;i<<=1){
for(int j=0;j<V;j++){
if(j&i) continue;
int x=f[j],y=f[j|i];
f[j]=ad(x,y),f[j|i]=ad(x,mod-y);
}
}
if(c!=1) for(int i=0;i<V;i++) f[i]=1ll*f[i]*c%mod;
}
void solve(){
cin>>n>>kk,m=3,k=17;
for(int i=0;i<m;i++) cin>>d[i],d[i]%=mod;
for(int i=0;i<M;i++){
for(int j=0;j<m;j++){
if(i&(1<<j)) add(w[i],mod-d[j]);
else add(w[i],d[j]);
}
}
for(int i=1;i<=n;i++) for(int j=0;j<m;j++) cin>>a[i][j];
for(int t=0;t<M;t++){
for(int i=1;i<=n;i++) for(int j=0;j<m;j++) if(t&(1<<j)) z[t][i]^=a[i][j];
for(int i=1;i<=n;i++) h[t][z[t][i]]++;
FWT(h[t],K,1);
}
for(int p=0;p<K;p++){
for(int t=0;t<M;t++) c[t]=h[t][p];
FWT(c,M,ksm(inv,m));
g[p]=1;
for(int i=0;i<M;i++) g[p]=1ll*g[p]*ksm(w[i],c[i])%mod;
}
FWT(g,K,ksm(inv,k));
for(int i=0;i<(1<<kk);i++) cout<<g[i]<<' ';
}