集合幂级数其实就是一种集合到数的映射,并且我们针对集合的一些操作(or  xor and specil or )为这种映射定义运算.其中一些东西可以通过某些手段将其复杂度降低.

orz vfk

 /**************************************************************
Problem: 4036
User: idy002
Language: C++
Result: Accepted
Time:3584 ms
Memory:13092 kb
****************************************************************/ #include <cstdio>
#include <cmath>
#define eps 1e-10
#define N 20 int n, bound;
long double f[<<N]; int sg( long double x ) { return (x>-eps)-(x<eps); } void trans() {
for( int i=; i<n; i++ ) {
int ss=bound^(<<i);
f[ss|(<<i)] += f[ss];
for( int s=(ss-)&ss; s!=ss; s=(s-)&ss )
f[s|(<<i)] += f[s];
}
}
void inverse() {
for( int i=; i<n; i++ ) {
int ss=bound^(<<i);
f[ss|(<<i)] -= f[ss];
for( int s=(ss-)&ss; s!=ss; s=(s-)&ss )
f[s|(<<i)] -= f[s];
}
} int main() {
scanf( "%d", &n );
bound = (<<n)-;
for( int s=; s<=bound; s++ )
scanf( "%Lf", f+s );
trans();
for( int s=; s<=bound; s++ ) {
if( sg(f[s]-)== )
f[s] = ;
else
f[s] = /(f[s]-);
}
inverse();
if( sg(f[bound])== )
printf( "INF\n" );
else
printf( "%.10Lf\n", f[bound] );
}

感谢Picks:http://picks.logdown.com/posts/179290-fast-walsh-hadamard-transform

现在可以做or, and, xor, 以及它们的否的卷积了。

 #include <cstdio>

 const int N = ;

 int n, U;
int a[<<N], b[<<N], c[<<N]; void trans( int a[], int flag ) {
for( int b=; b<n; b++ ) {
int u = U ^ (<<b);
for( int s=u,t=<<(n-); t; s=(s-)&u,t-- ) {
int l=a[s], r=a[s|(<<b)];
/*
NOT AND
if( flag==1 ) {
a[s] = l+r;
a[s|(1<<b)] = r;
} else {
a[s] = r;
a[s|(1<<b)] = l-r;
}
*/
/*
NOT XOR
if( flag==1 ) {
a[s] = l+r;
a[s|(1<<b)] = l-r;
} else {
a[s] = (l-r)/2;
a[s|(1<<b)] = (l+r)/2;
}
*/
/*
NOT OR
if( flag==1 ) {
a[s] = l;
a[s|(1<<b)] = l+r;
} else {
a[s] = r-l;
a[s|(1<<b)] = l;
}
*/
/*
OR
if( flag==1 ) {
a[s] = l;
a[s|(1<<b)] = l+r;
} else {
a[s] = l;
a[s|(1<<b)] = r-l;
}
*/
/*
AND
if( flag==1 ) {
a[s] = l+r;
a[s|(1<<b)] = r;
} else {
a[s] = l-r;
a[s|(1<<b)] = r;
}
*/
/*
XOR
if( flag==1 ) {
a[s] = l+r;
a[s|(1<<b)] = l-r;
} else {
a[s] = (l+r)/2;
a[s|(1<<b)] = (l-r)/2;
}
*/
}
}
}
int main() {
scanf( "%d", &n );
U = (<<n)-;
for( int i=; i<=U; i++ )
scanf( "%d", a+i );
for( int i=; i<=U; i++ )
scanf( "%d", b+i );
trans(a,);
trans(b,);
for( int s=; s<=U; s++ )
c[s] = a[s]*b[s];
trans(c,-);
for( int s=; s<=U; s++ )
printf( "%d ", c[s] );
printf( "\n" );
}

bzoj 4036 集合幂级数的更多相关文章

  1. BZOJ 2839: 集合计数 解题报告

    BZOJ 2839: 集合计数 Description 一个有\(N\)个元素的集合有\(2^N\)个不同子集(包含空集),现在要在这\(2^N\)个集合中取出若干集合(至少一个),使得 它们的交集的 ...

  2. [BZOJ 4036][HAOI2015]按位或

    4036: [HAOI2015]按位或 Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 746  Solved: 4 ...

  3. 【uoj#94】【集训队互测2015】胡策的统计(集合幂级数)

    题目传送门:http://uoj.ac/problem/94 这是一道集合幂级数的入门题目.我们先考虑求出每个点集的连通生成子图个数,记为$g_S$,再记$h_S$为点集$S$的生成子图个数,容易发现 ...

  4. 【杂题】[AGC034F] RNG and XOR【集合幂级数】【FWT】【DP】

    Description 你有一个随机数生成器,它会以一定的概率生成[0,2^N-1]中的数,每一个数的概率是由序列A给定的,Pi=Ai/sum(Ai) 现在有一个初始为0的数X,每一轮随机生成一个数v ...

  5. Codeforces 1408I - Bitwise Magic(找性质+集合幂级数)

    Codeforces 题面传送门 & 洛谷题面传送门 Yet another immortal D1+D2 I %%%%%% 首先直接统计肯定是非常不容易的,不过注意到这个 \(k\) 非常小 ...

  6. 洛谷 P6570 - [NOI Online #3 提高组] 优秀子序列(集合幂级数+多项式)

    洛谷题面传送门 首先 \(3^n\) 的做法就不多说了,相信对于会状压 dp+会枚举子集的同学来说不算困难(暴论),因此这篇博客将着重讲解 \(2^nn^2\) 的做法. 首先如果我们把每个 \(a_ ...

  7. BZOJ 4036: [HAOI2015]按位或 集合幂函数 莫比乌斯变换 莫比乌斯反演

    http://www.lydsy.com/JudgeOnline/problem.php?id=4036 http://blog.csdn.net/lych_cys/article/details/5 ...

  8. BZOJ 2839: 集合计数 [容斥原理 组合]

    2839: 集合计数 题意:n个元素的集合,选出若干子集使得交集大小为k,求方案数 先选出k个\(\binom{n}{k}\),剩下选出一些集合交集为空集 考虑容斥 \[ 交集为\emptyset = ...

  9. bzoj 2564 集合的面积

    Description 对于一个平面上点的集合P={(xi,yi )},定义集合P的面积F(P)为点集P的凸包的面积. 对于两个点集A和B,定义集合的和为: A+B={(xiA+xjB,yiA+yjB ...

随机推荐

  1. angularJs实现动态增加输入框

    摘要:首先,有一个这样的需求,就是说,我点击添加,会动态出现需要输入的输入框.我们需要定义一个对象,类似这种, {spc:{},spctions:[]} 意思是spc对应的是一个对象,spctions ...

  2. 从url到页面加载浏览器做了什么?

    从输入url到页面加载发生了什么?1.DNS解析DNS解析是一个递归查询的过程.DNS解析的过程就是寻找哪台机器上有你需要资源的过程,当你在浏览器中输入一个地址时,www.baidu.com.其实不是 ...

  3. bzoj千题计划233:bzoj 1304: [CQOI2009]叶子的染色

    http://www.lydsy.com/JudgeOnline/problem.php?id=1304 结论1:根节点一定染色 如果根节点没有染色,选择其子节点的一个颜色,那么所有这个颜色的子节点都 ...

  4. PythonCharm 配置本地反向代理激活

    以下方法仅做学习使用,如果条件允许,请自行购买正版软件,做开发的都知道软件开发出来不容易,能够支持就支持正版吧 首先去官网 下载 自己需要的 PYCHARM 版本 安装完启动会提示要激活, 选择 li ...

  5. html5 canvas 圆形径向渐变

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. Flex 编写 loading 组件

    Flex 界面初始化有时那个标准的进度条无法显示,界面长时间会处理空白的状态!我们来自定义一个进度条, 这个进度条加载在 Application 应用程序界面的 <s:Application 标 ...

  7. RPC笔记之初探RPC:DIY简单RPC框架

    一.什么是RPC RPC(Remote Procedure Call)即远程过程调用,简单的说就是在A机器上去调用B机器上的某个方法,在分布式系统中极其常用. rpc原理其实很简单,比较容易理解,在r ...

  8. py-faster-rcnn代码阅读3-roidb.py

    roidb是比较复杂的数据结构,存放了数据集的roi信息.原始的roidb来自数据集,在trian.py的get_training_roidb(imdb)函数进行了水平翻转扩充数量,然后prepare ...

  9. 使用eclipse构建Maven项目及发布一个Maven项目

    开发环境: Eclipse Jee Mars(截止2015年12月1日目前的最新版eclipse4.5),下载地址:http://www.eclipse.org/downloads/ 因为此版本已经集 ...

  10. 巧用PHP双$功能兼容线上线下配置文件

    2014年2月8日 19:27:05 情景: 开发过程中线上和线下的配置文件中的值是不一样的 例如:线上生产环境的样式域名为ie.style.abc.com,而开发环境为ie.style.abc.ne ...