CF 914G Sum the Fibonacci——子集卷积
题目:http://codeforces.com/contest/914/problem/G
第一个括号可以子集卷积;第三个括号可以用 FWT 异或卷积;这样算出选两个数组成 x 的方案数;三个部分的方案数分别乘上 f[ x ] 再一起与卷积即可。
注意子集卷积的时候不要改 tp[ i ][ s ] ,因为要的是恰好两个数拼起来,没有改过的(但是做过 FMT 的) tp[ i ][ s ] 存的是初值,表示选 1 个数的方案数。
所以如果可以选任意多个数,就可以像背包一样, tp[ j ][ s ] 用的改过的, tp[ i-j ][ s ] 用没改过的。
累计完 tp[ i ][ s ] 的时候,要在 i 这一层 iFMT 回去,再贡献给 a[ s ] ,不要直接加到 a[ s ] 上、做完所有的 i 之后再 iFMT 回去,因为 iFMT 只能弄回去对于同一个 i 的。
卷积的时候不要对 i - j == j 的情况去重,因为可以选重复的。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
int Mx(int a,int b){return a>b?a:b;}
const int K=,N=(<<K)+,mod=1e9+;
int f[N],a[N],b[N],c[N],bin[K+],len,bh;
int ct[N],tp[K+][N];
void upd(int &x){x>=mod?x-=mod:;}
void init()
{
bin[]=;for(int i=;i<=K;i++)bin[i]=bin[i-]<<;
for(int s=,j=bin[K];s<j;s++)ct[s]=ct[s-(s&-s)]+;
f[]=;f[]=;for(int i=,j=bin[K];i<j;i++)f[i]=f[i-]+f[i-],upd(f[i]);
}
void fwt_and(int *a,bool fx)
{
for(int R=;R<=len;R<<=)
for(int i=,m=R>>;i<len;i+=R)
for(int j=;j<m;j++)
a[i+j]+=(fx?mod-a[i+m+j]:a[i+m+j]),upd(a[i+j]);
}
void dv2(int &x){if(x&)x=(x+mod)>>; else x>>=;}
void fwt_xor(int *a,bool fx)
{
for(int R=;R<=len;R<<=)
for(int i=,m=R>>;i<len;i+=R)
for(int j=;j<m;j++)
{
int x=a[i+j],y=a[i+m+j];
a[i+j]=x+y; a[i+m+j]=x+mod-y;
upd(a[i+j]); upd(a[i+m+j]);
if(fx)dv2(a[i+j]),dv2(a[i+m+j]);
}
}
void fmt(int *a,bool fx)
{
for(int i=;i<len;i<<=)
for(int s=;s<len;s++)
if(s&i)a[s]+=(fx?mod-a[s^i]:a[s^i]),upd(a[s]);
}
void cz()
{
int t[N];
for(int i=;i<=bh;i++)fmt(tp[i],);//<= not <
for(int i=;i<=bh;i++)
{
for(int s=;s<len;s++)t[s]=;
for(int j=;j<=i;j++)
for(int s=;s<len;s++)
t[s]=(t[s]+(ll)tp[j][s]*tp[i-j][s])%mod;
fmt(t,);
for(int s=;s<len;s++)
if(i==ct[s])a[s]+=t[s],upd(a[s]);
}
/*
for(int i=0;i<=bh;i++)
{
for(int j=0;j<=i;j++)
for(int s=0;s<len;s++)
{
if(i!=ct[s])continue;//
a[s]=(a[s]+(ll)tp[j][s]*tp[i-j][s])%mod;//i-j==j is ok!
}
}
fmt(a,1);
*/
}
int main()
{
init();int n=rdn(),mx=;
for(int i=,d;i<=n;i++)
{
d=rdn();mx=Mx(mx,d);
tp[ct[d]][d]++;c[d]++;b[d]+=f[d];upd(b[d]);
}
for(bh=;bin[bh]<=mx;bh++);len=bin[bh];
cz();
fwt_xor(c,);for(int i=;i<len;i++)c[i]=(ll)c[i]*c[i]%mod;fwt_xor(c,);
for(int i=;i<len;i++)a[i]=(ll)a[i]*f[i]%mod;
for(int i=;i<len;i++)c[i]=(ll)c[i]*f[i]%mod;
fwt_and(a,); fwt_and(b,); fwt_and(c,);
for(int i=;i<len;i++)a[i]=(ll)a[i]*b[i]%mod*c[i]%mod;
fwt_and(a,);
int ans=;
for(int i=;i<len;i<<=)ans+=a[i],upd(ans);
printf("%d\n",ans);
return ;
}
CF 914G Sum the Fibonacci——子集卷积的更多相关文章
- CF 914 G Sum the Fibonacci —— 子集卷积,FWT
题目:http://codeforces.com/contest/914/problem/G 其实就是把各种都用子集卷积和FWT卷起来算即可: 注意乘 Fibonacci 数组的位置: 子集卷积时不能 ...
- CF914G Sum the Fibonacci FWT、子集卷积
传送门 一道良心的练习FWT和子集卷积的板子-- 具体来说就是先把所有满足\(s_a \& s_b = 0\)的\(s_a \mid s_b\)的值用子集卷积算出来,将所有\(s_a \opl ...
- CF914G Sum the Fibonacci (快速沃尔什变换FWT + 子集卷积)
题面 题解 这是一道FWT和子集卷积的应用题. 我们先设 cnt[x] 表示 Si = x 的 i 的数量,那么 这里的Nab[x]指满足条件的 Sa|Sb=x.Sa&Sb=0 的(a,b)二 ...
- 【codeforces914G】Sum the Fibonacci FWT+FST(快速子集变换)
题目描述 给出一个长度为 $n$ 的序列 $\{s\}$ ,对于所有满足以下条件的五元组 $(a,b,c,d,e)$ : $1\le a,b,c,d,e\le n$ : $(s_a|s_b)\& ...
- 【CF914G】Sum the Fibonacci 快速??变换模板
[CF914G]Sum the Fibonacci 题解:给你一个长度为n的数组s.定义五元组(a,b,c,d,e)是合法的当且仅当: 1. $1\le a,b,c,d,e\le n$2. $(s_a ...
- Codecraft-18 and Codeforces Round #458 (Div. 1 + Div. 2, combined)G. Sum the Fibonacci
题意:给一个数组s,求\(f(s_a | s_b) * f(s_c) * f(s_d \oplus s_e)\),f是斐波那契数列,而且要满足\(s_a\&s_b==0\),\((s_a | ...
- UOJ 348 【WC2018】州区划分——子集卷积
题目:http://uoj.ac/problem/348 参考:https://www.cnblogs.com/NaVi-Awson/p/9242645.html#%E5%AD%90%E9%9B%86 ...
- UOJ #348 州区划分 —— 状压DP+子集卷积
题目:http://uoj.ac/problem/348 一开始可以 3^n 子集DP,枚举一种状态的最后一个集合是什么来转移: 设 \( f[s] \) 表示 \( s \) 集合内的点都划分好了, ...
- UOJ348 WC2018 州区划分 状压DP、欧拉回路、子集卷积
传送门 应该都会判欧拉回路吧(雾 考虑状压DP:设\(W_i\)表示集合\(i\)的点的权值和,\(route_i\)表示点集\(i\)的导出子图中是否存在欧拉回路,\(f_i\)表示前若干个城市包含 ...
随机推荐
- android系统提供的几种颜色Color
http://blog.csdn.net/feiyangxiaomi/article/details/38338305 记录一下android自带颜色. Constants public static ...
- 20145315 《Java程序设计》实验四实验报告
20145315 <Java程序设计>实验四实验报告 第一步 安装Android Studio 按教程安装即可,安装过程中需要配置JAVA_HOME环境变量为jdk安装目录. 第二步 在I ...
- [BZOJ1176]Mokia
Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数Q<=10000,W<=2000 ...
- pix2pix-tensorflow搭建及其使用
目录 pix2pix-tensorflow搭建过程 1. 环境搭建 2. 环境说明 3. 开始搭建 4. 训练结果说明 5. 数据集 5.1 图片格式说明 5.3 从先用图片创建图像对 5.4 如何进 ...
- POJ 2391 Ombrophobic Bovines(二分+拆点+最大流)
http://poj.org/problem?id=2391 题意: 给定一个无向图,点i处有Ai头牛,点i处的牛棚能容纳Bi头牛,求一个最短时间T,使得在T时间内所有的牛都能进到某一牛棚里去. 思路 ...
- UVa 1658 海军上将(最小费用最大流)
https://vjudge.net/problem/UVA-1658 题意: 给出一个v个点e条边的有向加权图,求1~v的两条不相交(除了起点和终点外公共点)的路径,使得权和最小. 思路:把2到v- ...
- pysam - 多种格式基因组数据(sam/bam/vcf/bcf/cram/…)读写与处理模块(python)--转载
pysam 模块介绍!!!! http://pysam.readthedocs.io/en/latest/index.html 在开发基因组相关流程或工具时,经常需要读取.处理和创建bam.vcf.b ...
- Leetcode 15
//用类似双指针的方法,确定第一个i的位置后,j和k向左向右移动使nums[j]+nums[k] = -nums[i];注意特判 class Solution { public: vector< ...
- gradle基础配置
gradle构建脚本基础 gradle常用命令 //列出项目的所有属性. 这样你就可以看到插件加入的属性以及它们的默认值. gradle properties //列出项目的所有任务 gradle ...
- Bayes' theorem (贝叶斯定理)
前言 AI时代的到来一下子让人感觉到数学知识有些捉襟见肘,为了不被这个时代淘汰,我们需要不断的学习再学习.其中最常见的就是贝叶斯定理,这个定理最早由托马斯·贝叶斯提出. 贝叶斯方法的诞生源于他生前为解 ...