【CF914G】Sum the Fibonacci

题解:给你一个长度为n的数组s。定义五元组(a,b,c,d,e)是合法的当且仅当:

1. $1\le a,b,c,d,e\le n$
2. $(s_a|s_b) \& s_c \& (s_d $^$ s_e)=2^i$,i是某个整数
3. $s_a \& s_b=0$

求$\sum f(s_a|s_b) * f(s_c) * f(s_d $^$ s_e)$,f是斐波那契数列,对于所有合法的五元组(a,b,c,d,e)。答案模$10^9+7$。

$1\le n\le 10^6,0\le s_i< 2^{17}$

题解:说白了就是求:子集和卷积,异或卷积,与卷积。后面两个好求,学了一发子集和卷积。说白了就是强行加了一个占位多项式,即将数组多开一维记录子集中1的个数。然后合并时相当于背包合并,时间复杂度$O(n^22^n)$。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std; typedef long long ll;
const int maxn=(1<<17)+4;
const ll P=1000000007;
const ll inv=500000004;
ll a[maxn],c[maxn],d[maxn];
ll fa[maxn][18],fb[maxn][18],f[maxn];
ll ans;
int cnt[maxn];
int n,len;
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
n=rd();
int h,i,j,k,x,y,v;
f[1]=cnt[1]=1;
len=1<<17;
for(i=2;i<len;i++) f[i]=(f[i-1]+f[i-2])%P,cnt[i]=cnt[i-(i&-i)]+1;
for(i=1;i<=n;i++) v=rd(),fa[v][cnt[v]]++,d[v]++,c[v]=(c[v]+f[v])%P;
for(h=1;h<len;h<<=1) for(i=0;i<len;i++) if(i&h) for(j=0;j<=17;j++)
fa[i][j]=(fa[i][j]+fa[i-h][j])%P;
for(i=0;i<len;i++) for(j=0;j<=17;j++) for(k=0;k<=j;k++)
fb[i][j]=(fb[i][j]+fa[i][k]*fa[i][j-k])%P;
for(h=1;h<len;h<<=1) for(i=0;i<len;i++) if(i&h) for(j=0;j<=17;j++)
fb[i][j]=(fb[i][j]-fb[i-h][j]+P)%P;
for(i=0;i<len;i++) a[i]=(a[i]+f[i]*fb[i][cnt[i]])%P;
for(h=1;h<len;h<<=1) for(i=0;i<len;i++) if(i&h)
x=d[i-h],y=d[i],d[i-h]=(x+y)%P,d[i]=(x-y+P)%P;
for(i=0;i<len;i++) d[i]=d[i]*d[i]%P;
for(h=1;h<len;h<<=1) for(i=0;i<len;i++) if(i&h)
x=d[i-h],y=d[i],d[i-h]=(x+y)*inv%P,d[i]=(x-y+P)*inv%P;
for(i=0;i<len;i++) d[i]=d[i]*f[i]%P;
for(h=1;h<len;h<<=1) for(i=0;i<len;i++) if(!(i&h))
a[i]=(a[i]+a[i+h])%P,c[i]=(c[i]+c[i+h])%P,d[i]=(d[i]+d[i+h])%P;
for(i=0;i<len;i++) a[i]=a[i]*c[i]%P*d[i]%P;
for(h=1;h<len;h<<=1) for(i=0;i<len;i++) if(!(i&h))
a[i]=(a[i]-a[i+h]+P)%P;
for(i=0;i<17;i++) ans=(ans+a[1<<i])%P;
printf("%lld",ans);
return 0;
}

【CF914G】Sum the Fibonacci 快速??变换模板的更多相关文章

  1. CF914G Sum the Fibonacci(FWT,FST)

    CF914G Sum the Fibonacci(FWT,FST) Luogu 题解时间 一堆FWT和FST缝合而来的丑陋产物. 对 $ cnt[s_{a}] $ 和 $ cnt[s_{b}] $ 求 ...

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

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

  3. 题解 CF914G Sum the Fibonacci

    题目传送门 题目大意 给出\(n,s_{1,2,...,n}\),定义一个五元组\((a,b,c,d,e)\)合法当且仅当: \[1\le a,b,c,d,e\le n \] \[(s_a\vee s ...

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

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

  5. CF914G Sum the Fibonacci

    解:发现我们对a和b做一个集合卷积,对d和e做一个^FWT,然后把这三个全部对位乘上斐波那契数,然后做&FWT就行了. #include <bits/stdc++.h> , MO ...

  6. 计算机中的颜色XIV——快速变换颜色的V分量

    基本知识回顾: 计算机中的颜色Color,用RGB模式存储(用R.G.B三个分量表示颜色,每个分量的范围是0—255). 而计算机中的颜色除了用RGB模式表示以外,常见的还有HSV模式(或者是HSB. ...

  7. 89. a^b【快速幂模板】

    a^b Description 求 aa 的 bb 次方对 pp 取模的值. 输入格式 三个整数 a,b,pa,b,p ,在同一行用空格隔开. 输出格式 输出一个整数,表示a^b mod p的值. 数 ...

  8. BZOJ3944: Sum(杜教筛模板)

    BZOJ3944: Sum(杜教筛模板) 题面描述 传送门 题目分析 求\(\sum_{i=1}^{n}\mu(i)\)和\(\sum_{i=1}^{n}\varphi(i)\) 数据范围线性不可做. ...

  9. POJ3070 矩阵快速幂模板

    题目:http://poj.org/problem?id=3070 矩阵快速幂模板.mod写到乘法的定义部分就行了. 别忘了 I ( ) 和 i n i t ( ) 要传引用! #include< ...

随机推荐

  1. Vue-router路由判断页面未登录跳转到登录页面

    router.beforeEach((to, from, next) => { if (to.matched.some(record => record.meta.requireAuth) ...

  2. Android: JAVA和C# 3DES加密解密

    最近 一个项目.net 要调用JAVA的WEB SERVICE,数据采用3DES加密,涉及到两种语言3DES一致性的问题,下面分享一下,这里的KEY采用Base64编码,便用分发,因为Java的Byt ...

  3. zabbix服务端安装指南及常见问题解决

    1. 首先要准备LNMP环境 2. 在mysql中创建zabbix所需要的库和用户 mysql -uroot -pmysql> CREATE DATABASE zabbix CHARACTER ...

  4. linux环境中通过useradd命令,创建用户的时候指定用户的base-dir

    需求说明: 今天一个同事,问了一个这样的问题,在linux环境中,创建用户的时候,默认的是在/home目录下创建一个与用户名相同的家目录, 如何能够将这个/home更换成一个其他的,比如/opt/ap ...

  5. linux shell搜索某个字符串,然后在后面加上字符串?字符串后面插入字符串?sed字符串后面插入字符串?

    需求描述: 今天在配置nrpe.cfg这个文件,里面有allowed_hosts的IP地址,需要加上监控主机的地址,所以首先要搜索 到这个地址,然后呢,加上监控主机的地址,考虑通过sed命令来实现 操 ...

  6. pycharm使用docker容器的python解释器,

    上一篇是pycharm调用docker的镜像的python解释器. 此篇介绍pycharm 调用docker的容器的python解释器. 这两个思路还是不一样的,第一个是用pycham界面的选择pyt ...

  7. AngularJS------Error: Cannot find module '@angular-devkit/core'

    如图: 解决方法: 进入项目目录下执行以下代码 npm i --save-dev @angular-devkit/core

  8. 18个不常见的C#关键字,您使用过几个?

    转自:http://www.cnblogs.com/zhuqil/archive/2010/04/09/UnCommon-Csharp-keywords-A-Look.html 1.__arglist ...

  9. javascript 以“年-月-日 时:分:秒”格式显示当前时间

    运行代码 /** * Created by shgbit on 2015/1/9. *js代码 */ function showNow(){ var t=new Date();    var mont ...

  10. 【Android】ProgressBar

    http://www.cnblogs.com/wangying222/p/5304990.html http://www.cnblogs.com/plokmju/p/android_ProgressB ...