【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. 空基类优化—— EBCO—— empty base class optimization

    完全参考自:<C++ Templates The Complete Guide>e_CN,p_281 16.2 空基类优化 最近周围有点吵,论文没看进去,随便翻了本书…… 下文没有多大意义 ...

  2. python-反射、新式类与经典类搜索的优先级

    preface include: getattr setattr delattr hasattr class webserver(object): def __init__(self,num): se ...

  3. [Module] 08 - MVP by Mosby

    From: Mosby MVP使用教程[作者用心] View是消极视图(Passive View), 它尽量不去主动做事, 让Presenter通过抽象方式控制View 例子: 例如Presenter ...

  4. 基于JavaScript判断浏览器到底是关闭还是刷新(超准确)

    这篇文章主要介绍了基于JavaScript判断浏览器到底是关闭还是刷新(超准确)的相关资料,需要的朋友可以参考下 本文是小编总结的一些核心内容,个人感觉对大家有所帮助,具体内容请看下文: 页面加载时只 ...

  5. 下拉刷新 上拉更多 支持ListView GridView WebView【转载】

    转载自:http://www.stay4it.com/?p=245 老贴重发,源代码放附件了,需要的下载把. 终于有新货了.昨天改了下,在ListView和GridView加了个返回到顶部的按钮,li ...

  6. instsrv.exe srvany.exe启动服务

    1.通过注册表注册服务 private static readonly string regpath = @"SYSTEM\CurrentControlSet\Services\Consul ...

  7. AngularJS------报错"The selector "app-user-item" did not match any elements"

    原因:新建的组件没有在任何界面使用到 解决方法:在界面使用该组件

  8. Java通过复选框控件数组实现添加多个复选框控件

    编写程序,通过复选框控件数组事先选择用户爱好信息的复选框,在该程序中,要求界面中的复选框数量可以根据指定复选框名称的字符串数组的长度来自动调节. 思路如下: 创建JPanel面板对象: 使用JPane ...

  9. Java使用for循环输出杨辉三角

    杨辉三角形由数字排列,可以把它看做一个数字表,其基本特性是两侧数值均为1,其他位置的数值是其正上方的数字与左上角数值之和.编写程序,使用for循环输出包括10行在内的杨辉三角形. 思路是创建一个整型二 ...

  10. 8 -- 深入使用Spring -- 7...1 启动Spring 容器

    8.7.1 启动Spring容器 对于使用Spring的Web应用,无须手动创建Spring容器,而是通过配置文件声明式地创建Spring容器.因此,在Web应用中创建Spring容器有如下两种方式: ...