CF914G Sum the Fibonacci(FWT,FST)
CF914G Sum the Fibonacci(FWT,FST)
题解时间
一堆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)的更多相关文章
- [WC2018]州区划分(FWT,FST)
[WC2018]州区划分(FWT,FST) Luogu loj 题解时间 经典FST. 在此之前似乎用到FST的题并不多? 首先预处理一个子集是不是欧拉回路很简单,判断是否连通且度数均为偶数即可. 考 ...
- 【WC2018】州区划分(FWT,动态规划)
[WC2018]州区划分(FWT,动态规划) 题面 UOJ 洛谷 题解 首先有一个暴力做法(就有\(50\)分了) 先\(O(2^nn^2)\)预处理出每个子集是否合法,然后设\(f[S]\)表示当前 ...
- 【BZOJ5019】[SNOI2017]遗失的答案(FWT,动态规划)
[BZOJ5019][SNOI2017]遗失的答案(FWT,动态规划) 题面 BZOJ 题解 发现\(10^8\)最多分解为不超过\(8\)个本质不同质数的乘积. 而\(gcd\)和\(lcm\)分别 ...
- 1305 Pairwise Sum and Divide(数学 ,规律)
HackerRank 1305 Pairwise Sum and Divide 有这样一段程序,fun会对整数数组A进行求值,其中Floor表示向下取整: fun(A) sum = ...
- 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)
FWT大杂烩.跟着模拟做很多次FWT即可. #include<iostream> #include<cstdio> #include<cmath> #include ...
- Hat's Fibonacci(大数,好)
Hat's Fibonacci Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- 首师大附中科创教育平台 我的刷题记录 0304 50095106扔核弹(XDC,你懂的)
今天给大家献上"C"级题:50095106扔核弹(XDC,你懂的)!! 试题编号:0304 50095106扔核弹(XDC,你懂的) 难度级别:C: 运行时间限制:1000ms ...
- 算法大全(c,c++)
http://www.2cto.com/kf/201109/105758.html 算法大全(C,C++)一. 数论算法 1.求两数的最大公约数function gcd(a,b:integer):in ...
随机推荐
- Java 位运算总结
一.Java中支持的位运算 位与(&):二元运算符,两个为1时结果为1,否则为0 位或(|):二元运算符,两个其中有一个为1时结果就为1,否则为0 位异或(^):二元运算符,两个数同时为1或0 ...
- Lesson1——Tensor
Tensor Method 描述 is_tensor(obj) 如果 obj 是 PyTorch 张量,则返回 True : is_storage(obj) 如果 obj 是 PyTorch 存储对象 ...
- Python 中线程和进程
目录 线程和进程 一. 什么是进程 / 线程 1. 引论 2. 线程 3. 进程 4. 区别 5. 使用 二. 多线程使用 1. 常用方法 2. 常用参数 3. 多线程的应用 3.1 重写线程法 3. ...
- 数据平滑处理-均值|中值|Savitzky-Golay滤波器
均值滤波器 均值滤波器是一种使用频次较高的线性滤波器.它的实现原理很简单,就是指定一个长度大小为奇数的窗口,使用窗口中所有数据的平均值来替换中间位置的值,然后平移该窗口,平移步长为 1,继续重复上述操 ...
- 递归Recursion
从开始自学写代码开始,就感觉递归是个特别美丽的算法. "如果使用循环,程序的性能可能更高:如果使用递归,程序可能更容易理解.如何选择要看什么对你来说更重要." 编写递归函数时,必须 ...
- python语法:注释
Python语法:注释 python语言中的注释是来帮助程序员理解并读懂代码内容的文字.当然,注释不仅在python语言中是这个作用,在其他语言中也几乎一样. python注释的生成方式 所有演示 ...
- Docker学习笔记(详细)
目录 01 介绍 02 Docker安装 03 Docker常用命令 04 Docker镜像 05 Docker容器数据卷 06 Dockerfile解析 Dockerfile构建过程解析 Docke ...
- git报错error: RPC failed; HTTP 500 curl 22 The requested URL returned error: 500
报错 $ git push; Enumerating objects: 1002, done. Counting objects: 100% (1002/1002), done. Delta comp ...
- MySQL 8.0安装以及初始化错误解决方法
MySQL 8.0 安装配置及错误排查 官网下载 CentOS7环境下的具体安装步骤 初始化MySQL发生错误的解决方法 忘记数据库root密码 官网下载 mysql官网下载链接:https://de ...
- rsyn的使用
以下是rsync的语法: Local: rsync [OPTION...] SRC... [DEST] Access via remote shell: Pull: rsync [OPTION...] ...