[CF914D]Sum the Fibonacci
题目
点这里看题目。
分析
我们先放宽条件,重新定义五元组\((a,b,c,d,e)\)如下:
1.\(1\le a,b,c,d,e\le n\)。
2.\(s_a\&s_b=1\)。
并且设\(v(a,b,c,d,e)=(s_a|s_b)\&s_c\&(s_d\oplus s_e)\)。(这里的\(\oplus\)指代异或,下同)
于是乎答案可以变成:
&\sum_{p}\ \sum_{v(a,b,c,d,e)=2^p}\ f(s_a|s_b)\times f(s_c)\times f(s_d\oplus s_e)\\
=&\sum_{p}\ \sum_{i\& j\& k=2^p} f(i)\times \left(\sum_{a|b=i,a\& b=0}1\right)\times f(j)\times f(k)\times \left(\sum_{d\oplus e=k}1\right)
\end{aligned}
\]
中间一层求和实际上是与卷积,内部的第一个求和是一个子集卷积,内部第二个求和是一个异或卷积。与卷积可以 FWT (或者叫 FMT ), 子集卷积可以 FST ,异或卷积可以 FWT 。总的时间复杂度为\(O(n\log_2^2n)\)( FST 最花时间 )。
FST 实际上是 魔改 FWT 的思想,只不过为了避免分出来的子集还有交,就加了一位表示集合的大小(子集卷积满足\(A,B\subseteq S, A\cup B=S, A\cap B=\varnothing\),\(A\cap B=\varnothing\)的限制等价于\(|A|+|B|=|S|\))。
代码
#include <cstdio>
typedef long long LL;
const int mod = 1e9 + 7, inv2 = 5e8 + 4;
const int MAXN = 1e6 + 5, MAXL = ( 1 << 17 ) + 5, MAXLOG = 20;
template<typename _T>
void read( _T &x )
{
x = 0;char s = getchar();int f = 1;
while( s > '9' || s < '0' ){if( s == '-' ) f = -1; s = getchar();}
while( s >= '0' && s <= '9' ){x = ( x << 3 ) + ( x << 1 ) + ( s - '0' ), s = getchar();}
x *= f;
}
template<typename _T>
void write( _T x )
{
if( x < 0 ){ putchar( '-' ); x = ( ~ x ) + 1; }
if( 9 < x ){ write( x / 10 ); }
putchar( x % 10 + '0' );
}
template<typename _T>
_T MAX( const _T a, const _T b )
{
return a > b ? a : b;
}
int f[MAXLOG][MAXL], h[MAXL];
int A[MAXL], B[MAXL], C[MAXL], fibo[MAXL];
int cnt[MAXL];
int N, len, lg2;
int lowbit( const int x ) { return x & ( -x ); }
int fix( const int a ) { return ( a % mod + mod ) % mod; }
int count( int x ) { int ret = 0; while( x ) ret ++, x -= lowbit( x ); return ret; }
namespace OR
{
void FWT( int *F, const int mode )
{
for( int s = 2 ; s <= len ; s <<= 1 )
for( int i = 0, t = s >> 1 ; i < len ; i += s )
for( int j = i ; j < i + t ; j ++ )
F[j + t] = fix( F[j + t] + mode * F[j] );
}
}
namespace AND
{
void FWT( int *F, const int mode )
{
for( int s = 2 ; s <= len ; s <<= 1 )
for( int i = 0, t = s >> 1 ; i < len ; i += s )
for( int j = i ; j < i + t ; j ++ )
F[j] = fix( F[j] + mode * F[j + t] );
}
}
namespace XOR
{
void FWT( int *F, const int mode )
{
int t1, t2;
for( int s = 2 ; s <= len ; s <<= 1 )
for( int i = 0, t = s >> 1 ; i < len ; i += s )
for( int j = i ; j < i + t ; j ++ )
{
t1 = F[j], t2 = F[j + t];
if( mode > 0 ) F[j] = ( t1 + t2 ) % mod, F[j + t] = fix( t1 - t2 );
else F[j] = 1ll * ( t1 + t2 ) * inv2 % mod, F[j + t] = 1ll * fix( t1 - t2 ) * inv2 % mod;
}
}
}
void FST()
{
for( int i = 0 ; i <= lg2 ; i ++ ) OR :: FWT( f[i], 1 );
for( int i = 0 ; i <= lg2 ; i ++ )
{
for( int S = 0 ; S < len ; S ++ ) h[S] = 0;
for( int j = 0 ; j <= i ; j ++ )
for( int S = 0 ; S < len ; S ++ )
h[S] = ( h[S] + 1ll * f[j][S] * f[i - j][S] % mod ) % mod;
OR :: FWT( h, -1 );
for( int S = 0 ; S < len ; S ++ ) if( cnt[S] == i ) A[S] = ( A[S] + h[S] ) % mod;
}
}
void init()
{
fibo[0] = 0, fibo[1] = 1;
for( int i = 2 ; i < ( 1 << 17 ) ; i ++ ) fibo[i] = ( fibo[i - 1] + fibo[i - 2] ) % mod;
for( int i = 0 ; i < ( 1 << 17 ) ; i ++ ) cnt[i] = count( i );
}
signed main()
{
int mx = 0;
read( N );
init();
for( int i = 1, v ; i <= N ; i ++ )
{
read( v ), mx = MAX( v, mx );
f[cnt[v]][v] ++, C[v] ++, B[v] = ( B[v] + fibo[v] ) % mod;
}
for( lg2 = 0, len = 1 ; len <= mx ; len <<= 1, lg2 ++ );
FST();
XOR :: FWT( C, 1 );
for( int i = 0 ; i < len ; i ++ ) C[i] = 1ll * C[i] * C[i] % mod;
XOR :: FWT( C, -1 );
for( int i = 0 ; i < len ; i ++ ) A[i] = 1ll * A[i] * fibo[i] % mod, C[i] = 1ll * C[i] * fibo[i] % mod;
AND :: FWT( A, 1 ), AND :: FWT( B, 1 ), AND :: FWT( C, 1 );
for( int i = 0 ; i < len ; i ++ ) A[i] = 1ll * A[i] * B[i] % mod * C[i] % mod;
AND :: FWT( A, -1 );
int ans = 0;
for( int i = 1 ; i <= len ; i <<= 1 ) ( ans += A[i] ) %= mod;
write( ans ), putchar( '\n' );
return 0;
}
[CF914D]Sum the Fibonacci的更多相关文章
- 【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 ...
- CF914G Sum the Fibonacci(FWT,FST)
CF914G Sum the Fibonacci(FWT,FST) Luogu 题解时间 一堆FWT和FST缝合而来的丑陋产物. 对 $ cnt[s_{a}] $ 和 $ cnt[s_{b}] $ 求 ...
- 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 | ...
- 【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)\& ...
- codeforces914G Sum the Fibonacci
题目大意:给定一个长为$n$($n\leq 10^6$)的序列S,定义一个合法的五元组$(a,b,c,d,e)$合法当且仅当 $$ ( S_a \mid S_b ) and S_c and ( S_d ...
- CF 914 G Sum the Fibonacci —— 子集卷积,FWT
题目:http://codeforces.com/contest/914/problem/G 其实就是把各种都用子集卷积和FWT卷起来算即可: 注意乘 Fibonacci 数组的位置: 子集卷积时不能 ...
- 题解 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 ...
- CF914G Sum the Fibonacci FWT、子集卷积
传送门 一道良心的练习FWT和子集卷积的板子-- 具体来说就是先把所有满足\(s_a \& s_b = 0\)的\(s_a \mid s_b\)的值用子集卷积算出来,将所有\(s_a \opl ...
- CF914G Sum the Fibonacci
解:发现我们对a和b做一个集合卷积,对d和e做一个^FWT,然后把这三个全部对位乘上斐波那契数,然后做&FWT就行了. #include <bits/stdc++.h> , MO ...
随机推荐
- Flex打印功能 (2011-05-21 17:16:14)
http://blog.sina.com.cn/s/blog_4f925fc30101824k.html
- JAVA基础4---序列化和反序列化深入整理(JDK序列化)
一.什么是序列化和反序列化? 序列化:将对象状态信息转化成可以存储或传输的形式的过程(Java中就是将对象转化成字节序列的过程) 反序列化:从存储文件中恢复对象的过程(Java中就是通过字节序列转化成 ...
- 浙工大新生赛莫队处理+区间DP+KMP+分析题
题目描述 读入一个长度为n的整数数列a1,a2,…,an,以及一个整数K. q组询问. 每组询问包含一个二元组(l, r), 其中1≤l≤r≤ n, 求所有满足以下条件的二元组(l2, r2)的数目: ...
- C++98/11/17表达式类别
目标 以下代码能否编译通过,能否按照期望运行?(点击展开) #include <utility> #include <type_traits> namespace cpp98 ...
- docker-compose 命令详解
1.docker-compose的使用非常类似于docker命令的使用,但是需要注意的是大部分的compose命令都需要到docker-compose.yml文件所在的目录下才能执行. 2.[Linu ...
- CSS3和HTML5头部定位自用
body{ max-width: 540px; min-width: 320px; margin: 0 auto; font: normal 14px/1.5 tahoma; color: #000; ...
- Linux下VCS2014和Verdi2015的联合使用
VCS和Verdi是IC设计中常用的两款开发工具.VCS是Synopsys公司的产品,和大家所熟知的ModeSim一样的都是EDA仿真工具.Verdi是Nocas公司(已经被Synopsys公司收购) ...
- Azure Kubernetes 服务 (AKS)
一.首先创建集群 1,注意:一定要选择Kubernets Service(红框处),上面的那一堆虚拟机都没有用, 2,设置好相关属性,集群大小可后面更改节点数,但是节点的大小不可更改 二.登陆集群 在 ...
- Redis学习笔记(2)
一.配置文件(部分) 1. UNITS(单位) 数据单位 2. INCLUDES(包含) 可以包含其他配置文件,而redis.conf作为总的配置文件 3. NETWORK(网络配置) -网络端口的绑 ...
- [ES6系列-05]字符串相关操作更方便
[原创] 码路工人 Coder-Power 大家好,这里是码路工人有力量,我是码路工人,你们是力量. github-pages 博客园cnblogs 今天的内容是,关于 ES6 JavaScript ...