正题

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


题目大意

长度为\(2^n\)的序列\(a,b\)求一个\(c\)满足

\[c_k=\sum_{i|j=k,i\&j=\varnothing}a_i\times b_j
\]

解题思路

从炫酷反演魔术过来的,顺便写掉这题

简单的说就是求\(k\)的所有子集和其补集的乘积和。

只有\(i|j=k\)的话就是普通的\(\text{FWT}\)了,但是还有\(i\&j=\varnothing\)这个东西。

一个巧妙的想法是把这个条件转换为\(|i|+|j|=|i\cup j|\),显然两个之间是充要的。

然后可以把\(a_i\)存在\(f_{ct(i),i}\)这个位置,其中\(ct(i)\)表示\(i\)中\(1\)的个数。同理\(b_i\)存在\(g_{ct(i),i}\)这个位置。

然后就有卷积

\[h_{a,b}=\sum_{i+j=a,x|y=b}f_{i,x}\times g_{j,y}
\]

这个先暴力\(\text{FWT}\)了\(f,g\)然后暴力卷积然后\(\text{IFWT}\)回去就好了。

时间复杂度\(O(n^22^n)\),不能全开\(\text{long long}\)不然会\(\text T\)的


code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=21,P=1e9+9;
int n,k,ct[1<<N],f[N][1<<N],g[N][1<<N],h[N][1<<N];
void FWT(int *f,int op){
for(int p=2;p<=n;p<<=1)
for(int k=0,len=p>>1;k<n;k+=p)
for(int i=k;i<k+len;i++)
(f[i+len]+=(f[i]*op+P)%P)%=P;
return;
}
signed main()
{
// printf("%d",sizeof(f)>>20);
scanf("%d",&k);n=(1<<k);
for(int i=0;i<n;i++){
if(i)ct[i]=ct[i-(i&-i)]+1;
scanf("%d",&f[ct[i]][i]);
}
for(int i=0;i<n;i++)
scanf("%d",&g[ct[i]][i]);
for(int i=0;i<=k;i++)
FWT(f[i],1),FWT(g[i],1);
for(int i=0;i<=k;i++)
for(int j=0;j<=i;j++)
for(int x=0;x<n;x++)
(h[i][x]+=1ll*f[j][x]*g[i-j][x]%P)%=P;
for(int i=0;i<=k;i++)FWT(h[i],-1);
for(int i=0;i<n;i++)
printf("%d ",h[ct[i]][i]);
return 0;
}

P6097-[模板]子集卷积的更多相关文章

  1. luogu P6097 子集卷积 FST FWT

    LINK:子集卷积 学了1h多 终于看懂是怎么回事了(题解写的不太清楚 翻了好几篇博客才懂 一个需要用到的性质 二进制位为1个数是i的二进制数s 任意两个没有子集关系.挺显然. 而FST就是利用这个性 ...

  2. CF914G Sum the Fibonacci FWT、子集卷积

    传送门 一道良心的练习FWT和子集卷积的板子-- 具体来说就是先把所有满足\(s_a \& s_b = 0\)的\(s_a \mid s_b\)的值用子集卷积算出来,将所有\(s_a \opl ...

  3. CF 914G Sum the Fibonacci——子集卷积

    题目:http://codeforces.com/contest/914/problem/G 第一个括号可以子集卷积:第三个括号可以用 FWT 异或卷积:这样算出选两个数组成 x 的方案数:三个部分的 ...

  4. UOJ 348 【WC2018】州区划分——子集卷积

    题目:http://uoj.ac/problem/348 参考:https://www.cnblogs.com/NaVi-Awson/p/9242645.html#%E5%AD%90%E9%9B%86 ...

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

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

  6. CF 914 G Sum the Fibonacci —— 子集卷积,FWT

    题目:http://codeforces.com/contest/914/problem/G 其实就是把各种都用子集卷积和FWT卷起来算即可: 注意乘 Fibonacci 数组的位置: 子集卷积时不能 ...

  7. UOJ #348 州区划分 —— 状压DP+子集卷积

    题目:http://uoj.ac/problem/348 一开始可以 3^n 子集DP,枚举一种状态的最后一个集合是什么来转移: 设 \( f[s] \) 表示 \( s \) 集合内的点都划分好了, ...

  8. 【学习笔记】fwt&&fmt&&子集卷积

    前言:yyb神仙的博客 FWT 基本思路:将多项式变成点值表达,点值相乘之后再逆变换回来得到特定形式的卷积: 多项式的次数界都为\(2^n\)的形式,\(A_0\)定义为前一半多项式(下标二进制第一位 ...

  9. UOJ348 WC2018 州区划分 状压DP、欧拉回路、子集卷积

    传送门 应该都会判欧拉回路吧(雾 考虑状压DP:设\(W_i\)表示集合\(i\)的点的权值和,\(route_i\)表示点集\(i\)的导出子图中是否存在欧拉回路,\(f_i\)表示前若干个城市包含 ...

  10. Future Failure CodeForces - 838C (博弈论,子集卷积)

    大意: 两人轮流操作一个长$n$, 只含前$k$种小写字母的串, 每次操作删除一个字符或者将整个串重排, 每次操作后得到的串不能和之前出现过的串相同, 求多少种串能使先手必胜. 找下规律发现$n$为奇 ...

随机推荐

  1. asp.net mvc 传值

    视图的查找 asp.net MVC 不需要用using 释放资源

  2. 【mysql】索引优化分析

    1. 索引的概念 1.1 索引是什么 MySQL 官方对索引的定义为:索引(Index)是帮助MySQL 高效获取数据的数据结构.可以得到索引的本质:索引是数据结构.可以简单理解为排好序的快速查找数据 ...

  3. 从一个URL加载一个Document

    存在问题 你需要从一个网站获取和解析一个HTML文档,并查找其中的相关数据.你可以使用下面解决方法: 解决方法 使用 Jsoup.connect(String url)方法: Document doc ...

  4. uwp 的锁屏功能

    [UWP开发]自定义锁屏&桌面壁纸 mtobeiyf关注 2015.11.01 00:16:55字数 394阅读 1,249 调用通用的API来设置桌面壁纸,可以实现很多有趣的功能.在Wind ...

  5. mysql ORDER BY 中文出现错误问题

    在MySQL中,我们经常会对一个字段进行排序查询,但进行中文排序和查找的时候,对汉字的排序和查找结果往往都是错误的. 这种情况在MySQL的很多版本中都存在. 如果这个问题不解决,那么MySQL将无法 ...

  6. 不同的 count 用法

    不同的 count 用法效率:在 select count(?) from t 这样的查询语句里面, count(*).count(主键 id).count(字段) 和 count(1) 等不同用法的 ...

  7. SpringBoot笔记(7)

    一.单元测试 1.JUnit5简介 Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库 作为最新版本的JUnit框架,JUnit5与之前版本的Junit框架有很大的不 ...

  8. Python面试题小试牛刀

    1.声明变量注意事项有那些? 1.变量名只能用字母.数字或下划线的任意组合 2.变量名不能以数字为第一个字符 3.内置函数名不能用 2.如何查看变量在内存中的地址? id(变量名) 3.写代码 a. ...

  9. Java实现一个死锁

    Java实现一个死锁 有一个藏宝图(treasureMapFragment)分成两份jack持有treasureMapFragment1残片1,json持有残片2.jack要求必须先看到json的残图 ...

  10. java IO操作,看完你应该就清晰了。

    前言: java中IO里的一些知识对于一个java新手来说,是比较难理解的.因为里面存在一些很绕的概念,比如: 1.到底是读入写出,还是读出写入: 2.我要将一个文件的内容拷贝到另一个文件是先用Inp ...