题解:

直接做 FWT 考虑下面这个式子:

F ^ S = ∏ i = 1 n ( ∑ j = 1 k ( − 1 ) ∣ S ∩ p [ i ] [ j ] ∣ a j ) \hat F_S=\prod_{i=1}^n(\sum_{j=1}^k(-1)^{|S\cap p[i][j]|}a_j) F^S​=i=1∏n​(j=1∑k​(−1)∣S∩p[i][j]∣aj​)

如果裸做 FWT 复杂度是 O ( 2 m m n k ) O(2^mmnk) O(2mmnk),如果直接用上面的式子算出点值然后 IFWT 复杂度是 O ( 2 m n k ) O(2^m n k) O(2mnk),不管怎么做都不太友好。

考虑 ∏ i = 1 m \prod_{i=1}^m\limits i=1∏m​ 后面那个括号里面的东西,不难发现对于不同的 i i i,可能的取值只有 2 k 2^{k} 2k 种。

我们强制每个位置把 p [ i ] [ 1 ] p[i][1] p[i][1] 选上,其他的 p [ i ] [ j ] p[i][j] p[i][j] 全部异或上 p [ i ] [ 1 ] p[i][1] p[i][1],最后输出的时候异或回去。这样可能的取值只有 2 k − 1 2^{k-1} 2k−1 种。我们只需要对于每一个 F ^ S \hat F_S F^S​,计算这 2 k − 1 2^{k-1} 2k−1种取值出现了多少次。

然后是一个比较巧妙的构造。

假设我们想要求出 F S , T F_{S,T} FS,T​,表示在 F ^ S \hat F_S F^S​的表达中, T T T形态出现了多少次。我们可以考虑构造出若干组方程,然后解方程来得到 F S , T F_{S,T} FS,T​的值。

解方程的方式可以考虑IFWT,于是考虑构造出 ∑ W ( − 1 ) ∣ W ∩ T ∣ F S , W \sum_{W}(-1)^{|W\cap T|}F_{S,W} ∑W​(−1)∣W∩T∣FS,W​。

既然这样,考虑每一种 T T T 该如何贡献到某个 S S S,显然直接在 ⊕ j ∈ T p [ i ] [ j ] \oplus_{j\in T}p[i][j] ⊕j∈T​p[i][j] 的位置+1,然后对 S S S 进行 FWT 即可。

证明的话其实问题也不大,考虑 FWT 之前的点值为 H S , T = ∑ i = 1 n [ S = ⊕ j ∈ T p [ i ] [ j ] ] H_{S,T}=\sum_{i=1}^n[S=\oplus_{j\in T}p[i][j]] HS,T​=i=1∑n​[S=⊕j∈T​p[i][j]]

FWT 得到 H S ^ , T = ∑ i = 1 n ∏ j ∈ T ( − 1 ) ∣ S ∩ p [ i ] [ j ] ∣ H_{\hat S,T}=\sum_{i=1}^n\prod_{j\in T}(-1)^{|S\cap p[i][j]|} HS^,T​=i=1∑n​j∈T∏​(−1)∣S∩p[i][j]∣

而 F F F 的点值表示为 F S , T = ∑ i = 1 n ∏ j = 1 k − 1 [ [ j ∈ T ] = [ ∣ S ∩ p [ i ] [ j ] ∣ % 2 = 1 ] ] F_{S,T}=\sum_{i=1}^n\prod_{j=1}^{k-1}\left[[j\in T]=[|S\cap p[i][j]|\%2=1]\right] FS,T​=i=1∑n​j=1∏k−1​[[j∈T]=[∣S∩p[i][j]∣%2=1]]

对 T T T 进行 FWT 可以得到 F S , T ^ = ∑ W ( − 1 ) ∣ W ∩ T ∣ ∑ i = 1 n ∏ j = 1 k − 1 [ [ j ∈ W ] = [ ∣ S ∩ p [ i ] [ j ] ∣ % 2 = 1 ] ] = ∑ i = 1 n ( − 1 ) ∑ j ∈ T ( − 1 ) ∣ S ∩ p [ i ] [ j ] ∣ \begin{aligned} F_{S,\hat T}&=\sum_{W}(-1)^{|W\cap T|}\sum_{i=1}^n\prod_{j=1}^{k-1}\left[[j\in W]=[|S\cap p[i][j]|\%2=1]\right]\\ &=\sum_{i=1}^n(-1)^{\sum_{j\in T}(-1)^{|S\cap p[i][j]|}} \end{aligned} FS,T^​​=W∑​(−1)∣W∩T∣i=1∑n​j=1∏k−1​[[j∈W]=[∣S∩p[i][j]∣%2=1]]=i=1∑n​(−1)∑j∈T​(−1)∣S∩p[i][j]∣​

和上面其实是一样的。


代码:

#include<bits/stdc++.h>
#define ll long long
#define re register
#define cs constnamespace IO{inline char gc(){static cs int Rlen=1<<22|1;static char buf[Rlen],*p1,*p2;return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,Rlen,stdin),p1==p2)?EOF:*p1++; }template<typename T>T get_integer(){char c;while(!isdigit(c=gc()));T x=c^48;while(isdigit(c=gc()))x=x*10+(c^48);return x;}inline int gi(){return get_integer<int>();}char obuf[30000007],*oh=obuf;template<typename T>void print(T a,char c=' '){static char ch[23];int tl=0;do ch[++tl]=a%10; while(a/=10);while(tl)*oh++=ch[tl--]^48;*oh++=c;}struct obuf_flusher{~obuf_flusher(){fwrite(obuf,1,oh-obuf,stdout);}}Flusher;
}using namespace IO;using std::cerr;
using std::cout;cs int mod=998244353;
inline int add(int a,int b){return a+b>=mod?a+b-mod:a+b;}
inline int dec(int a,int b){return a-b<0?a-b+mod:a-b;}
inline int mul(int a,int b){ll r=(ll)a*b;return r>=mod?r%mod:r;}
inline void Inc(int &a,int b){a+=b-mod;a+=a>>31&mod;}
inline void Dec(int &a,int b){a-=b;a+=a>>31&mod;}
inline void Mul(int &a,int b){a=mul(a,b);}
inline int po(int a,int b){int r=1;for(;b;b>>=1,Mul(a,a))if(b&1)Mul(r,a);return r;}
inline void ex_gcd(int a,int b,int &x,int &y){if(!b){x=1,y=0;return;}ex_gcd(b,a%b,y,x);y-=a/b*x;
}inline int inv(int a){int x,y;ex_gcd(mod,a,y,x);return x+(x>>31&mod);}int n,m,k;void FWT(int *A,int S){for(int re i=1;i<S;i<<=1)for(int re j=0;j<S;j+=i<<1)for(int re k=0;k<i;++k){int x=A[j+k],y=A[i+j+k];A[j+k]=add(x,y),A[i+j+k]=dec(x,y);}
}void IFWT(int *A,int S){FWT(A,S);int iS=inv(S);for(int re i=0;i<S;++i)Mul(A[i],iS);
}cs int N=1e6+7;int S,T,xr;
int a[11],p[N][11],G[1<<10|7],H[1<<20|7];
int vl[1<<10|7],*f[1<<19|7];void Main(){n=gi(),m=gi(),k=gi();for(int re i=0;i<k;++i)a[i]=gi();S=1<<m;T=1<<(k-1);for(int re s=0;s<T;++s){vl[s]=a[0];for(int re i=1;i<k;++i)(s>>(i-1)&1)?Dec(vl[s],a[i]):Inc(vl[s],a[i]);}for(int re i=1;i<=n;++i){for(int re j=0;j<k;++j)p[i][j]=gi();for(int re j=1;j<k;++j)p[i][j]^=p[i][0];xr^=p[i][0];}for(int re s=0;s<T;++s){memset(H,0,sizeof(int)*S);for(int re i=1;i<=n;++i){int ps=0;for(int re j=1;j<k;++j)if(s&(1<<(j-1)))ps^=p[i][j];++H[ps];}FWT(H,S);f[s]=new int[S];for(int re i=0;i<S;++i)f[s][i]=H[i];}for(int re i=0;i<S;++i){for(int re s=0;s<T;++s)G[s]=f[s][i];FWT(G,T);H[i]=1;for(int re s=0;s<T;++s)Mul(H[i],po(vl[s],G[s]>>(k-1)));}IFWT(H,S);for(int re i=0;i<S;++i)print(H[i^xr],' ');
}inline void file(){#ifdef zxyoifreopen("yuyuko.in","r",stdin);
#endif
}
signed main(){file();Main();return 0;}

【校内模拟】西行寺无余涅槃(FWT)相关推荐

  1. 2017.6.11 校内模拟赛

    题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小cop ...

  2. 第十四届蓝桥杯校内模拟赛第二期-Java个人题解(仅供参考)

    刚刚结束第十四届蓝桥杯校内模拟赛第二期,在这记录下自己的代码 不保证正确! 不保证正确! 不保证正确! 有问题一起改正!! 题解 2048 代码: package _14届模拟2;public cla ...

  3. 2021年 第十二届蓝桥杯第二期校内模拟赛题解(Java版)

    时隔多日,终于会写一些简单DP了哈哈哈! 稍微改版,方便阅读,若有错,请指出 2019年 第十届蓝桥杯省赛题解(JavaB组版) 2020年 第十一届蓝桥杯第一场省赛题解(JavaB组版) 2020年 ...

  4. 蓝桥杯校内模拟赛_C++组

    蓝桥杯校内模拟赛 填空题 填空题比较简单,只需要在空格中填写整数答案即可: 在计算机存储中,15.125GB是多少MB? 解题思路: 1GB=1024MB,打开系统计算器计算即可 答案: 15488 ...

  5. 第十四届蓝桥杯校内模拟赛第一期——Python

    第十四届蓝桥杯校内模拟赛第一期--Python 文章目录 第十四届蓝桥杯校内模拟赛第一期--Python 1.二进制位数 问题描述 参考答案 扩展 2. 晨跑 问题描述 参考答案 扩展 3. 调和级数 ...

  6. 【蓝桥】软件校内模拟赛(二)反倍数 题目+题解

    文章目录 前言 反倍数 题目描述 前言 本题解为第十一届软件类校内模拟赛个人题解,但非官方满分题解,因此,可能存在下列问题 题意理解错误,导致答案错误. 代码中存在一些问题,导致答案错误. 算法复杂度 ...

  7. 【蓝桥】第十一届软件类校内模拟赛(二)填空题部分

    起晚了起晚了,比赛都快结束了才整完qwq 文章目录 前言 填空题 1题目描述 2题目描述 3题目描述 4题目描述 前言 本题解为第十一届软件类校内模拟赛个人题解,但非官方满分题解,因此,可能存在下列问 ...

  8. [蓝桥杯第十一届校内模拟赛] Apare_xzc

    华中师范大学蓝桥杯第十一届校内模拟赛 2020/3/22 8:00-12:00 题目还是比省赛要简单的,我9:25就做完了. 第一题 分析: 简单题,求给定的1200000的正约数的个数.我们可以暴力 ...

  9. 【校内模拟】【18-10-16】长者 【主席树】【哈希】

    (拖更N天终于想起来我还有博客 ) (校内模拟的题面&代码联赛后解除封印~) 题解 1.0 这次是正经的分析 把题目概括一下,进行认真分析,我们可以依次得到以下信息(由浅至深): 1.考虑骗分 ...

最新文章

  1. Pytorch 类型错误:Expected object of type torch.FloatTensor but found type torch.cuda.FloatTensor.
  2. python爬虫案例_推荐上百个github上Python爬虫案例
  3. php图片加边框,php在图片上增加矩形框并加入水印
  4. Spring Boot(Spring的自动整合框架)
  5. Python_logging模块
  6. 搭建本地Yum软件源安装Cloudera Manager 5
  7. 数据中心进水了怎么办?数据中心如何防洪?
  8. yolov5搭建环境_YOLOv5从入门到部署之:训练私有数据并修改模型
  9. Android java传递int类型数组给C
  10. MacOS下SVN的使用
  11. 计算机技巧分享,2个鲜为人知的电脑技巧!
  12. 下载proteus-isis时出现的错误
  13. linux烧录到手机,新人求教,怎么烧录Linux系统到一个小芯片上?
  14. 【人物志】美团前端通道主席洪磊:一位产品出身、爱焊电路板的工程师
  15. 【渝粤教育】国家开放大学2018年秋季 2045T金融企业会计 参考试题
  16. TP-Link基于亚马逊云科技部署面向运营商的IoT云管平台
  17. 写交织(AXI4不在支持写交织功能)
  18. 首都师范大学 计算机学院,首都师范大学信息工程学院
  19. 安卓应用开发Socket通信 客户端+服务器端
  20. 使用python,目前最全的Python使用手册

热门文章

  1. esp32连接海萤物联网显示南京室外温度
  2. 大数据用户画像实时项目实战
  3. 计算机在未来工作中的应用论文,计算机技术在企业管理中的应用论文
  4. 信用卡验证java_java - 信用卡验证器的java - SO中文参考 - www.soinside.com
  5. 【DevOps】K8s 基础知识
  6. SpringBoot+Vue车辆充电桩系统设计与实现
  7. 如何设计“找回用户帐号”功能
  8. JavaScript实现类似Python的字符串占位符.format()
  9. php数组根据值合并,PHP根据键值合并数组
  10. 培训Python三个月拿高薪?起底人工智能“速成班”忽悠大法