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的更多相关文章

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

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

  2. 快速沃尔什变换(FWT)及K进制异或卷积&快速子集变换(FST)讲解

    前言: $FWT$是用来处理位运算(异或.与.或)卷积的一种变换.位运算卷积是什么?形如$f[i]=\sum\limits_{j\oplus k==i}^{ }g[j]*h[k]$的卷积形式(其中$\ ...

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

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

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

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

  5. Comet Contest#11 F arewell(DAG计数+FWT子集卷积)

    传送门. 题解: 4月YY集训时做过DAG计数,和这个基本上是一样的,但是当时好像直接暴力子集卷积,不然我省选时不至于不会,这个就多了个边不选的概率和子集卷积. DAG计数是个套路来的,利用的是DAG ...

  6. CF838C(博弈+FWT子集卷积+多项式ln、exp)

    传送门: http://codeforces.com/problemset/problem/838/C 题解: 如果一个字符串的排列数是偶数,则先手必胜,因为如果下一层有后手必赢态,直接转移过去,不然 ...

  7. @总结 - 2@ 位运算卷积/子集卷积 —— FWT/FMT

    目录 @0 - 参考资料@ @1 - 异或卷积概念及性质@ @2 - 快速沃尔什正变换(异或)@ @3 - 快速沃尔什逆变换(异或)@ @4 - 与卷积.或卷积@ @5 - 参考代码实现@ @6 - ...

  8. CF914G Sum the Fibonacci (快速沃尔什变换FWT + 子集卷积)

    题面 题解 这是一道FWT和子集卷积的应用题. 我们先设 cnt[x] 表示 Si = x 的 i 的数量,那么 这里的Nab[x]指满足条件的 Sa|Sb=x.Sa&Sb=0 的(a,b)二 ...

  9. [WC2018]州区划分(状压,子集卷积)

    [洛谷题面]https://www.luogu.org/problemnew/show/P4221 首先考虑判定一个子图是否合法: (1)连通:并查集判断即可. (2)没有欧拉回路:存在欧拉回路的条件 ...

随机推荐

  1. CF55D Beautiful numbers 题解

    题目 Volodya is an odd boy and his taste is strange as well. It seems to him that a positive integer n ...

  2. 分享一个集成.NET Core+Swagger+Consul+Polly+Ocelot+IdentityServer4+Exceptionless+Apollo+SkyWalking的微服务开发框架

    集成.NET Core+Swagger+Consul+Polly+Ocelot+IdentityServer4+Exceptionless+Apollo的微服务开发框架 Github源代码地址 htt ...

  3. 关于npm和yarn 安装vue脚手架

    第一篇博客有点小紧张.轻喷~ 第一步:安装node.js       地址 --------https://nodejs.org/en/ 详细步骤这里就不写了    可以去看     地址 ----- ...

  4. URL编码与二次encodeURI

    转自:http://foryougeljh.iteye.com/blog/1456706 一般来说,URL只能使用英文字母.阿拉伯数字和某些标点符号,不能使用其他文字和符号.比如,世界上有英文字母的网 ...

  5. cas客户端流程详解(源码解析)--单点登录

    博主之前一直使用了cas客户端进行用户的单点登录操作,决定进行源码分析来看cas的整个流程,以便以后出现了问题还不知道是什么原因导致的 cas主要的形式就是通过过滤器的形式来实现的,来,贴上示例配置: ...

  6. .NET Core 跨平台

    前言   .NET Core是一个开源的模块化的Framework,不管是开发web或移动设备都在同一个Framework(.NET Core)下运行,而且 .NET Core也可在不同的操作系统上运 ...

  7. CSS-好玩的样式(用高斯模糊制作平缓突起)

    一.效果图: 应用: 二.上代码 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  8. Kafka 信息整理

    请说明什么是传统的消息传递方法? 传统的消息传递方法包括两种: ·排队:在队列中,一组用户可以从服务器中读取消息,每条消息都发送给其中一个人. ·发布-订阅:在这个模型中,消息被广播给所有的用户. 为 ...

  9. 采用 Unicode 标点属性方式的正则表达式,可以去掉所有的标点符号,

    public class Test { public static void main(String[] args) { String str = "!!!??!!!!%*)%¥!KTV去符 ...

  10. 没想到 Google 排名第一的编程语言,为什么会这么火?

    没想到吧,Python 又拿第一了! 在 Google 公布的编程语言流行指数中,Python 依旧是全球范围内最受欢迎的技术语言!   01 为什么 Python 会这么火? 核心还是因为企业需要用 ...