【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=6057

【题目大意】

  有 C[k]=∑_(i&j=k)A[i^j]*B[i|j]
  求 Ans=∑ C[i]*1526^i%998244353

【题解】

  将C[k]代入Ans的计算式得到 Ans=∑ A[i^j]*B[i|j]*1526^(i&j)%MOD
  我们发现(i^j)&(i&j)=0且(i^j)^(i&j)=i|j,
  因此bit[i^j]+bit[i&j]=bit[i|j],并有(i^j)|(i&j)=i|j
  设x=i^j, y=i&j, z=i|j 我们发现x&z=x,
  所以每对乘法乘上2^bit[x]的参数即可。
  我们计算1526^x和A[y]*2^bit[y]的or卷积,然后按位和B数组相乘。
  考虑bit[x]+bit[y]=bit[z]的卷积限制要求,我们将x和y按照bit进行分维,
  对于维度做和为bit[x]+bit[y]=bit[z]的子集FWT。

【代码】

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;
const int mod=998244353;
LL pow(LL a,LL b,LL p){LL t=1;for(a%=p;b;b>>=1LL,a=a*a%p)if(b&1LL)t=t*a%p;return t;}
void FWT(int*a,int n){
for(int d=1;d<n;d<<=1)for(int m=d<<1,i=0;i<n;i+=m)for(int j=0;j<d;j++){
int x=a[i+j],y=a[i+j+d];
a[i+j+d]=(x+y)%mod;
}
}
void UFWT(int*a,int n){
for(int d=1;d<n;d<<=1)for(int m=d<<1,i=0;i<n;i+=m)for(int j=0;j<d;j++){
int x=a[i+j],y=a[i+j+d];
a[i+j+d]=(y-x+mod)%mod;
}
}
const int N=1<<20;
int n;
int A[21][N],B[21][N],C[21][N],bit[N],a[N],b[N],c[N];
int main(){
while(~scanf("%d",&n)){
int len=1<<n;
for(int i=0;i<len;i++)scanf("%d",&a[i]);
for(int i=0;i<len;i++)scanf("%d",&b[i]);
for(int i=0;i<len;i++)bit[i]=bit[i>>1]+(i&1);
memset(A,0,sizeof(A));
memset(B,0,sizeof(B));
memset(C,0,sizeof(C));
LL t=1;
for(int i=0;i<len;i++){
A[bit[i]][i]=1LL*a[i]*(1<<bit[i])%mod;
B[bit[i]][i]=t;
t=t*1526%mod;
}
for(int i=0;i<=n;i++){
FWT(A[i],len);
FWT(B[i],len);
}
for(int k=0;k<=n;k++){
for(int j=0;j+k<=n;j++){
for(int i=0;i<len;i++)C[j+k][i]=(C[j+k][i]+1LL*A[j][i]*B[k][i]%mod)%mod;
}
}
for(int i=0;i<=n;i++)UFWT(C[i],len);
for(int i=0;i<len;i++)c[i]=C[bit[i]][i];
LL ans=0;
for(int i=0;i<len;i++)ans=(ans+(1LL*c[i]*b[i])%mod)%mod;
printf("%d\n",ans);
}return 0;
}

HDU 6057 Kanade's convolution(FWT)的更多相关文章

  1. hdu 6057 Kanade's convolution(子集卷积)

    题解: 然后就是接下来如何fwt 也就是如何处理bit(x) - bit(y) = bit(k)这个条件. 其实就是子集卷积. 把bit(x)和bit(y)划分成两个集合,然后就是子集卷积的形式. 这 ...

  2. [HDU6057] Kanade‘s convolution (FWT)

    题面 出自HDU6057 给你两个数列 A [ 0... 2 m − 1 ] A[0...2^m-1] A[0...2m−1] 和 B [ 0... 2 m − 1 ] B[0...2^m-1] B[ ...

  3. HDU 6057 - Kanade's convolution | 2017 Multi-University Training Contest 3

    /* HDU 6057 - Kanade's convolution [ FWT ] | 2017 Multi-University Training Contest 3 题意: 给定两个序列 A[0 ...

  4. 2017ACM暑期多校联合训练 - Team 3 1003 HDU 6058 Kanade's sum (模拟)

    题目链接 Problem Description Give you an array A[1..n]of length n. Let f(l,r,k) be the k-th largest elem ...

  5. HDU 6057 Kanade's convolution

    题目链接:HDU-6057 题意: 思路:先按照官方题解推导出下面的式子: 现在唯一的问题就是怎么解决[bit(x)-bit(y)=bit(k)]的问题. 我们定义\( F(A,k)_{i}=\lef ...

  6. 【CF850E】Random Elections(FWT)

    [CF850E]Random Elections(FWT) 题面 洛谷 CF 题解 看懂题就是一眼题了... 显然三个人是等价的,所以只需要考虑一个人赢了另外两个人就好了. 那么在赢另外两个人的过程中 ...

  7. 【CF662C】Binary Table(FWT)

    [CF662C]Binary Table(FWT) 题面 洛谷 CF 翻译: 有一个\(n*m\)的表格(\(n<=20,m<=10^5\)), 每个表格里面有一个\(0/1\), 每次可 ...

  8. 「WC2018」州区划分(FWT)

    「WC2018」州区划分(FWT) 我去弄了一个升级版的博客主题,比以前好看多了.感谢 @Wider 不过我有阅读模式的话不知为何 \(\text{LATEX}\) 不能用,所以我就把这个功能删掉了. ...

  9. 【HDU5909】Tree Cutting(FWT)

    [HDU5909]Tree Cutting(FWT) 题面 vjudge 题目大意: 给你一棵\(n\)个节点的树,每个节点都有一个小于\(m\)的权值 定义一棵子树的权值为所有节点的异或和,问权值为 ...

随机推荐

  1. httpd -v command not found

    使用 find / -name "apachectl"查找文件目录下执行 ./apachectl -v

  2. 【Android XML】Android XML 转 Java Code 系列之 介绍(1)

    最近在公司做一个项目,需要把Android界面打包进jar包给客户使用.对绝大部分开发者来说,Android界面的布局以XML文件为主,并辅以少量Java代码进行动态调整.而打包进jar包的代码,意味 ...

  3. 【快速玩转Source Filmmaker】用黑科技做出自己的OC和想要的模型

    [快速玩转Source Filmmaker]用黑科技做出自己的OC和想要的模型https://tieba.baidu.com/p/4154097168

  4. Centos. Mac 通过nfs 搭建共享目录

    centos 关闭fiewalld,selinux yum install yum install nfs-utils portmap vim /etc/exports 文件写入时使用anonuid用 ...

  5. 怎么删除Windows服务

    1,首先找到服务名字. 2,在cmd中进到c:下面 3,sc delete 名字. 删除成功

  6. PHP在变量前面加&是什么意思

    比如: <? php $a = 'c' ; $b = & $a ; //表示$b 和 $a 引用了同一个变量 $a = 'abc' ; //这里重置了$a echo $b ; //将输出 ...

  7. django “如何”系列7:错误汇报

    当你正在运行一个公共的站点的时候,你应该关掉DEBUG设置.这将使你的服务器运行的更快,同时也能预防别有用心的用户从你的错误页面看到你应用的一些详细配置信息.然而,当debug为false的时候,你将 ...

  8. 20:django中的安全问题

    本节主要是讲解django中的安全特性,讲述django是如何应对网站一般面临的安全性问题 跨站点脚本(XXS)攻击 跨站点脚本攻击是指一个用户把客户端脚本注入到其他用户的浏览器中.通常是通过在数据库 ...

  9. Python调用shell

    今天学习了Python通过子进程调用shell,感觉教程上讲的过于繁复,有一些根本没用的功能,比如重定向输入输出,这个shell本身就支持,没有必要用Python的api.决定自己总结下. 其实总的来 ...

  10. POJ-1681

    Painter's Problem Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4839   Accepted: 2350 ...