luogu P6097 子集卷积 FST FWT
LINK:子集卷积
学了1h多 终于看懂是怎么回事了(题解写的不太清楚 翻了好几篇博客才懂
一个需要用到的性质 二进制位为1个数是i的二进制数s 任意两个没有子集关系。挺显然。
而FST就是利用这个性质靠FWT做的。
直接说做法:
定义\(f_{i,s}\)表示|s|为i状态为s的值.
对于另一个g数组也同时定义。设答案为h.
那么有 \(h_{i,s}=\sum_{j \subseteq s}f_{|j|,j}\cdot \sum_{w\subseteq s,w|j==s}g_{i-|j|,w}\)
暴力做这个还是\(3^n\) 但是可以发现此时限制松动了对于第二个状态我们不再要求交集为空了 但是如果交集不为空在第一个限制下.
就会出现依然合法的情况. 所以只需要对\(f_j,g_{i-j}\)进行或卷积即可.
const int MAXN=300010,GG=3;
int n,maxx;
int sum[1<<20];
int a[22][1<<20],b[22][1<<20],f[22][1<<20];
inline int add(int x,int y){return x+y>=mod?x+y-mod:x+y;}
inline int mux(int x,int y){return x-y<0?x-y+mod:x-y;}
inline void FWT(int *a)
{
for(int len=2;len<=maxx+1;len=len<<1)
{
int mid=len>>1;
for(int j=0;j<=maxx;j+=len)
{
for(int i=0;i<mid;++i)
{
a[i+j+mid]=add(a[i+j+mid],a[i+j]);
}
}
}
}
inline void IFWT(int *a)
{
for(int len=2;len<=maxx+1;len=len<<1)
{
int mid=len>>1;
for(int j=0;j<=maxx;j+=len)
{
for(int i=0;i<mid;++i)
{
a[i+j+mid]=mux(a[i+j+mid],a[i+j]);
}
}
}
}
int main()
{
freopen("1.in","r",stdin);
get(n);maxx=1<<n;--maxx;
rep(0,maxx,i)sum[i]=sum[i>>1]+(i&1),get(a[sum[i]][i]);
rep(0,maxx,i)get(b[sum[i]][i]);
rep(0,n,i)FWT(a[i]),FWT(b[i]);
rep(0,n,i)
{
rep(0,maxx,s)rep(0,i,j)f[i][s]=add(f[i][s],(ll)a[j][s]*b[i-j][s]%mod);
IFWT(f[i]);
}
rep(0,maxx,i)put_(f[sum[i]][i]);return 0;
}
luogu P6097 子集卷积 FST FWT的更多相关文章
- CF 914 G Sum the Fibonacci —— 子集卷积,FWT
题目:http://codeforces.com/contest/914/problem/G 其实就是把各种都用子集卷积和FWT卷起来算即可: 注意乘 Fibonacci 数组的位置: 子集卷积时不能 ...
- 快速沃尔什变换(FWT)及K进制异或卷积&快速子集变换(FST)讲解
前言: $FWT$是用来处理位运算(异或.与.或)卷积的一种变换.位运算卷积是什么?形如$f[i]=\sum\limits_{j\oplus k==i}^{ }g[j]*h[k]$的卷积形式(其中$\ ...
- CF914G Sum the Fibonacci FWT、子集卷积
传送门 一道良心的练习FWT和子集卷积的板子-- 具体来说就是先把所有满足\(s_a \& s_b = 0\)的\(s_a \mid s_b\)的值用子集卷积算出来,将所有\(s_a \opl ...
- 【学习笔记】fwt&&fmt&&子集卷积
前言:yyb神仙的博客 FWT 基本思路:将多项式变成点值表达,点值相乘之后再逆变换回来得到特定形式的卷积: 多项式的次数界都为\(2^n\)的形式,\(A_0\)定义为前一半多项式(下标二进制第一位 ...
- Comet Contest#11 F arewell(DAG计数+FWT子集卷积)
传送门. 题解: 4月YY集训时做过DAG计数,和这个基本上是一样的,但是当时好像直接暴力子集卷积,不然我省选时不至于不会,这个就多了个边不选的概率和子集卷积. DAG计数是个套路来的,利用的是DAG ...
- CF838C(博弈+FWT子集卷积+多项式ln、exp)
传送门: http://codeforces.com/problemset/problem/838/C 题解: 如果一个字符串的排列数是偶数,则先手必胜,因为如果下一层有后手必赢态,直接转移过去,不然 ...
- @总结 - 2@ 位运算卷积/子集卷积 —— FWT/FMT
目录 @0 - 参考资料@ @1 - 异或卷积概念及性质@ @2 - 快速沃尔什正变换(异或)@ @3 - 快速沃尔什逆变换(异或)@ @4 - 与卷积.或卷积@ @5 - 参考代码实现@ @6 - ...
- CF914G Sum the Fibonacci (快速沃尔什变换FWT + 子集卷积)
题面 题解 这是一道FWT和子集卷积的应用题. 我们先设 cnt[x] 表示 Si = x 的 i 的数量,那么 这里的Nab[x]指满足条件的 Sa|Sb=x.Sa&Sb=0 的(a,b)二 ...
- [WC2018]州区划分(状压,子集卷积)
[洛谷题面]https://www.luogu.org/problemnew/show/P4221 首先考虑判定一个子图是否合法: (1)连通:并查集判断即可. (2)没有欧拉回路:存在欧拉回路的条件 ...
随机推荐
- 【Java8新特性】冰河带你看尽Java8新特性,你想要的都在这儿了!!(文本有福利)
写在前面 很多小伙伴留言说,冰河你能不能写一些关于Java8的文章呢,看书看不下去,看视频进度太慢.好吧,看到不少读者对Java8还是比较陌生的,那我就写一些关于Java8的文章吧,希望对大家有所帮助 ...
- Codeforces 1215D Ticket Game 题解
Codeforces 1215D Ticket Game 原题 题目 Monocarp and Bicarp live in Berland, where every bus ticket consi ...
- day40 线程
目录 一.开启线程的两种方式 二.用进程和线程分别实现tcp 三.线程对象实现join方法 四.同一个进程下的多个线程数据是共享的 五.线程对象属性及其他方法 六.守护线程 七.线程互斥锁 八.GIL ...
- 06 Vue生命周期钩子
生命周期钩子 表示一个vue实例从创建到销毁的这个过程,将这个过程的一些时间节点赋予了对应的钩子函数 钩子函数: 满足特点条件被回调的方法 new Vue({ el: "#app" ...
- 如果你想写自己的Benchmark框架
目录 简介 八条军规 第一条军规 第二条军规 第三条军规 第四条军规 第五条军规 第六条军规 第七条军规 最后一条军规 总结 简介 使用过JMH的同学一定会惊叹它的神奇.JMH作为一个优秀的Bench ...
- requests接口自动化6-Body里json格式数据形式的post请求:json
Body里json格式数据形式的post请求:用json传参 fiddler里请求响应内容: 传递的json数据 [{"stepId":"0","ca ...
- Python-02 可视化之tkinter介绍
1 控件介绍 1.1 Label import tkinter as tk # 使用Tkinter前需要先导入 window = tk.Tk() window.title('My Window') w ...
- linux专题(八):用户组管理
http://dwz.date/UDf 每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理.不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个 ...
- Python之堡垒机
本节内容 项目实战:运维堡垒机开发 前景介绍 到目前为止,很多公司对堡垒机依然不太感冒,其实是没有充分认识到堡垒机在IT管理中的重要作用的,很多人觉得,堡垒机就是跳板机,其实这个认识是不全面的,跳板功 ...
- 使用Vue做出跑马灯效果
<div id="pmd"> <h4> {{msg}}</h4> <input type="b ...