CF914G Sum the Fibonacci(FWT,FST)

Luogu

题解时间

一堆FWT和FST缝合而来的丑陋产物。

对 $ cnt[s_{a}] $ 和 $ cnt[s_{b}] $ 求FST,对 $ cnt[s_{d}] $ 和 $ cnt[s_{e}] $ 求异或卷积,然后对 $ cnt[ s_{ a }| s_{ b } ] \times f[ s_{ a }| s_{ b } ] $ , $ cnt[ s_{ c } ] \times f[ s_{ c } ] $ , $ cnt[ s_{ d } \oplus s_{ e } ] \times f[ s_{ d } \oplus s_{ e } ] $ 求与卷积,将每个 $ 2^{i} $ 项的答案加起来就完事。

#include<bits/stdc++.h>
using namespace std;
typedef long long lint;
struct pat{int x,y;pat(int x=0,int y=0):x(x),y(y){}bool operator<(const pat &p)const{return x==p.x?y<p.y:x<p.x;}};
template<typename TP>inline void read(TP &tar)
{
TP ret=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){ret=ret*10+(ch-'0');ch=getchar();}
tar=ret*f;
}
namespace RKK
{
const int N=18,S=1<<17;
const int mo=1000000007,inv2=500000004;
int bcnt(int x){return __builtin_popcount(x);}
int lbit(int x){return __builtin_ffs(x);}
int add(int a,const int &b){a+=b;if(a>=mo) a-=mo;else if(a<0) a+=mo;return a;}
void doadd(int &a,const int &b){a+=b;if(a>=mo) a-=mo;else if(a<0) a+=mo;}
void fwtand(int *a,int len,int tp)
{
for(int i=1;i<len;i<<=1)for(int j=0;j<len;j+=i<<1)for(int k=0;k<i;k++)
doadd(a[j+k],tp*a[j+k+i]);
}
void fwtor(int *a,int len,int tp)
{
for(int i=1;i<len;i<<=1)for(int j=0;j<len;j+=i<<1)for(int k=0;k<i;k++)
doadd(a[j+k+i],tp*a[j+k]);
}
void fwtxor(int *a,int len,int tp)
{
int x,y;
for(int i=1;i<len;i<<=1)for(int j=0;j<len;j+=i<<1)for(int k=0;k<i;k++)
{
x=a[j+k],y=a[j+k+i];
a[j+k]=add(x,y),a[j+k+i]=add(x,-y);
if(tp==-1) a[j+k]=(lint)a[j+k]*inv2%mo,a[j+k+i]=(lint)a[j+k+i]*inv2%mo;
}
}
int n,mxlen=1,mxlog,mxa,bc[S];
int f[N][S],g[S];
int a[S],b[S],c[S],fib[S];
int main()
{
fib[0]=0,fib[1]=1;for(int i=2;i<S;i++) fib[i]=add(fib[i-1],fib[i-2]);
for(int i=1;i<S;i++) bc[i]=bcnt(i);
read(n);for(int i=1,w;i<=n;i++)
read(w),mxa=max(mxa,w),f[bc[w]][w]++,a[w]++,doadd(b[w],fib[w]);
while(mxlen<=mxa) mxlen<<=1,mxlog++;
for(int i=0;i<=mxlog;i++) fwtor(f[i],mxlen,1);
for(int i=0;i<=mxlog;i++)
{
memset(g,0,mxlen*4);
for(int j=0;j<=i;j++)for(int s=0;s<mxlen;s++) doadd(g[s],1ll*f[j][s]*f[i-j][s]%mo);
fwtor(g,mxlen,-1);
for(int s=0;s<mxlen;s++)if(bc[s]==i) doadd(c[s],g[s]);
}
fwtxor(a,mxlen,1);for(int i=0;i<mxlen;i++) a[i]=1ll*a[i]*a[i]%mo;fwtxor(a,mxlen,-1);
for(int i=0;i<mxlen;i++) a[i]=1ll*a[i]*fib[i]%mo;
for(int i=0;i<mxlen;i++) c[i]=1ll*c[i]*fib[i]%mo;
fwtand(a,mxlen,1),fwtand(b,mxlen,1),fwtand(c,mxlen,1);for(int i=0;i<mxlen;i++) c[i]=1ll*a[i]*b[i]%mo*c[i]%mo;fwtand(c,mxlen,-1);
int ans=0;for(int i=1;i<mxlen;i<<=1) doadd(ans,c[i]);
printf("%d\n",ans);
return 0;
}
}
int main(){return RKK::main();}

CF914G Sum the Fibonacci(FWT,FST)的更多相关文章

  1. [WC2018]州区划分(FWT,FST)

    [WC2018]州区划分(FWT,FST) Luogu loj 题解时间 经典FST. 在此之前似乎用到FST的题并不多? 首先预处理一个子集是不是欧拉回路很简单,判断是否连通且度数均为偶数即可. 考 ...

  2. 【WC2018】州区划分(FWT,动态规划)

    [WC2018]州区划分(FWT,动态规划) 题面 UOJ 洛谷 题解 首先有一个暴力做法(就有\(50\)分了) 先\(O(2^nn^2)\)预处理出每个子集是否合法,然后设\(f[S]\)表示当前 ...

  3. 【BZOJ5019】[SNOI2017]遗失的答案(FWT,动态规划)

    [BZOJ5019][SNOI2017]遗失的答案(FWT,动态规划) 题面 BZOJ 题解 发现\(10^8\)最多分解为不超过\(8\)个本质不同质数的乘积. 而\(gcd\)和\(lcm\)分别 ...

  4. 1305 Pairwise Sum and Divide(数学 ,规律)

    HackerRank   1305 Pairwise Sum and Divide   有这样一段程序,fun会对整数数组A进行求值,其中Floor表示向下取整:   fun(A)     sum = ...

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

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

  6. Codeforces914G Sum the Fibonacci(FWT)

    FWT大杂烩.跟着模拟做很多次FWT即可. #include<iostream> #include<cstdio> #include<cmath> #include ...

  7. Hat's Fibonacci(大数,好)

    Hat's Fibonacci Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  8. 首师大附中科创教育平台 我的刷题记录 0304 50095106扔核弹(XDC,你懂的)

    今天给大家献上"C"级题:50095106扔核弹(XDC,你懂的)!! 试题编号:0304   50095106扔核弹(XDC,你懂的) 难度级别:C: 运行时间限制:1000ms ...

  9. 算法大全(c,c++)

    http://www.2cto.com/kf/201109/105758.html 算法大全(C,C++)一. 数论算法 1.求两数的最大公约数function gcd(a,b:integer):in ...

随机推荐

  1. python数据类型内置方法

    内容概要 列表内置方法 字典内置方法 字符串转换成字典的方法 eval() 元组内置方法 元组相关笔试题 集合内置方法 列表内置方法 l1 = [2, 4, 5, 7, 3, 9, 0, 6] # 升 ...

  2. [LeetCode]14.最长公共前缀(Java)

    原题地址: longest-common-prefix 题目描述: 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入:st ...

  3. 第8章 File I/O,File类操作文件的属性

    1.文件 1.1.什么是文件? 答:文件可认为是相关记录或放在一起的数据的集合 1.2.文件- -般存储在哪里? 答: 磁盘,硬盘,文件夹 1.3.JAVA程序如何访向文件属性? JAVA API:i ...

  4. Spring Boot部署之jar包运行

    上篇阐述了Spring Boot war部署项目,本篇阐述另一种运行方式:jar包运行. 一.打jar包 1.修改pom.xml配置 2.执行package(对于module执行package之前需要 ...

  5. 『无为则无心』Python面向对象 — 45、面向对象编程

    目录 1.面向对象编程的概念 2.面向对象编程和面向过程编程的区别 (1)面向过程编程 (2)面向对象编程 3.举例理解面向对象 4.Python的面向对象编程 5.面向对象的几大核心特性 1.面向对 ...

  6. Spring boot 项目中put提交Date数据时出现type=Bad Request, status=400状态码

    1.问题原因 经过测试发现,当客户端页面提交日期为空时会出现以下异常,如果提交日期不为空则不会出现上述问题.出现这种错误的原因是没有对代码中的Date型参数进行格式化,接收为null的日期类型参数时, ...

  7. mysql 事务 隔离性 锁

    1.四大特性 1.1 原子性(Atomicity) 一个事务是不可分割的最小工作单位.一个事务是不可分割的最小工作单位. 利用undo log保证原子性,undo log记录的是操作的反向语句,例如执 ...

  8. 神奇!这款 Vue 后台框架居然不用手动配置路由

    前言 做 Vue 开发脱离不了路由,尤其是中大型项目,页面多且杂,在配置路由的时候总是会变得逐渐暴躁,因为费时,并且又没有什么太多技术含量,总觉得是在浪费时间. 另外如果接手了别人的项目,当业务有变更 ...

  9. 一个杂项PDF

    不是很难,但是就是比较考虑个人的细心程度,下载压缩包解压得到一个pdf文件,直接打开发现没有什么隐藏的信息,准换成word也是,没有什么东西,使用winhex打开看一下,一开始是没有注意到什么的,这里 ...

  10. C#中String StringBuilder

    String和StringBuilder和StringBuffer,这三个都是值得深究一翻的,可能很多人会说,实在不行的话,都全部用StringBuilder,啥事没有,我不能说你的想法事不正确的,但 ...