P6097-[模板]子集卷积
正题
题目链接:https://www.luogu.com.cn/problem/P6097
题目大意
长度为\(2^n\)的序列\(a,b\)求一个\(c\)满足
\]
解题思路
从炫酷反演魔术过来的,顺便写掉这题
简单的说就是求\(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}\)这个位置。
然后就有卷积
\]
这个先暴力\(\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-[模板]子集卷积的更多相关文章
- luogu P6097 子集卷积 FST FWT
LINK:子集卷积 学了1h多 终于看懂是怎么回事了(题解写的不太清楚 翻了好几篇博客才懂 一个需要用到的性质 二进制位为1个数是i的二进制数s 任意两个没有子集关系.挺显然. 而FST就是利用这个性 ...
- CF914G Sum the Fibonacci FWT、子集卷积
传送门 一道良心的练习FWT和子集卷积的板子-- 具体来说就是先把所有满足\(s_a \& s_b = 0\)的\(s_a \mid s_b\)的值用子集卷积算出来,将所有\(s_a \opl ...
- CF 914G Sum the Fibonacci——子集卷积
题目:http://codeforces.com/contest/914/problem/G 第一个括号可以子集卷积:第三个括号可以用 FWT 异或卷积:这样算出选两个数组成 x 的方案数:三个部分的 ...
- UOJ 348 【WC2018】州区划分——子集卷积
题目:http://uoj.ac/problem/348 参考:https://www.cnblogs.com/NaVi-Awson/p/9242645.html#%E5%AD%90%E9%9B%86 ...
- hdu 6057 Kanade's convolution(子集卷积)
题解: 然后就是接下来如何fwt 也就是如何处理bit(x) - bit(y) = bit(k)这个条件. 其实就是子集卷积. 把bit(x)和bit(y)划分成两个集合,然后就是子集卷积的形式. 这 ...
- CF 914 G Sum the Fibonacci —— 子集卷积,FWT
题目:http://codeforces.com/contest/914/problem/G 其实就是把各种都用子集卷积和FWT卷起来算即可: 注意乘 Fibonacci 数组的位置: 子集卷积时不能 ...
- UOJ #348 州区划分 —— 状压DP+子集卷积
题目:http://uoj.ac/problem/348 一开始可以 3^n 子集DP,枚举一种状态的最后一个集合是什么来转移: 设 \( f[s] \) 表示 \( s \) 集合内的点都划分好了, ...
- 【学习笔记】fwt&&fmt&&子集卷积
前言:yyb神仙的博客 FWT 基本思路:将多项式变成点值表达,点值相乘之后再逆变换回来得到特定形式的卷积: 多项式的次数界都为\(2^n\)的形式,\(A_0\)定义为前一半多项式(下标二进制第一位 ...
- UOJ348 WC2018 州区划分 状压DP、欧拉回路、子集卷积
传送门 应该都会判欧拉回路吧(雾 考虑状压DP:设\(W_i\)表示集合\(i\)的点的权值和,\(route_i\)表示点集\(i\)的导出子图中是否存在欧拉回路,\(f_i\)表示前若干个城市包含 ...
- Future Failure CodeForces - 838C (博弈论,子集卷积)
大意: 两人轮流操作一个长$n$, 只含前$k$种小写字母的串, 每次操作删除一个字符或者将整个串重排, 每次操作后得到的串不能和之前出现过的串相同, 求多少种串能使先手必胜. 找下规律发现$n$为奇 ...
随机推荐
- ASP.NET Core:ASP.NET Core程序使用Docker部署
一.前言 这篇文章介绍如何将一个ASP.NET Core应用程序在Docker中进行部署.开发工具使用的是Visual Studio 2019和VS Code. 二.使用Docker部署 我们选择新建 ...
- C# 查询所有设备的插拔事件
private void test() { //Win32_DeviceChangeEvent Win32_VolumeChangeEvent ManagementEventWatcher watc ...
- C++11 shared_ptr智能指针(超级详细)
在实际的 C++ 开发中,我们经常会遇到诸如程序运行中突然崩溃.程序运行所用内存越来越多最终不得不重启等问题,这些问题往往都是内存资源管理不当造成的.比如: 有些内存资源已经被释放,但指向它的指针并没 ...
- C++11 shared_ptr(智能指针)详解
要确保用 new 动态分配的内存空间在程序的各条执行路径都能被释放是一件麻烦的事情.C++ 11 模板库的 <memory> 头文件中定义的智能指针,即 shared _ptr 模板,就是 ...
- Java Web基础 --- Servlet 综述(理论篇)
摘要: Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.本文首先从请求/响应架构应用的大背景谈起 Servlet 的由来,明确 Ser ...
- Spring源码解析之ConfigurationClassPostProcessor(三)
在上一章笔者介绍了ConfigurationClassParser.doProcessConfigurationClass(...)方法,在这个方法里调用了processImports(...)方法处 ...
- 第13篇-通过InterpreterCodelet存储机器指令片段
在TemplateInterpreterGenerator::generate_all()函数中生成了许多字节码指令以及一些虚拟机辅助执行的机器指令片段,例如生成空指针异常抛出入口的实现如下: { C ...
- C# ArrayPool 源码解读之 byte[] 池化
一:背景 1. 讲故事最近在分析一个 dump 的过程中发现其在 gen2 和 LOH 上有不少size较大的free,仔细看了下,这些free生前大多都是模板引擎生成的html片段的byte[]数组 ...
- opengl中标准矩形像素点手动网格化为三角形条带的实现
这里以一张矩形图片为例进行说明: 一张图片的像素点是孤立的,导入opengl中进行绘制出来,看起来没问题,但是当我们放大图片时候,显示的就是一个个孤立的点,而没有像看图软件放大图片那样看起来还是连续的 ...
- SpringBoot2.x+mybatis plus3.x集成Activit7版本
最近在写一个开源项目ruoyi-vue-pro,暂时负责Activiti7工作流的搭建,接这个任务一个原因,是比较好奇Activiti7版本与先前的5.6版本究竟有什么区别,因为先前在工作当中,最开始 ...