题解 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_b)\wedge s_c \wedge (s_d\oplus s_e)=2^i,i\in \mathbb{Z}
\] - \[s_a\wedge s_b=0
\]
求出对于所有合法的五元组\((a,b,c,d,e)\):
\]
其中\(f(i)\)表示第\(i\)位斐波拉契数列。
思路
其实这个题应该算\(\text {FST}\)的入门级题目,也不是很难。
首先,我们定义\(v(a,b,c,d,e)=(s_a\vee s_b)\wedge s_c \wedge (s_d\oplus s_e)\)。于是我们可以把式子写成这样一个形式:
\]
\]
然后我们就发现第一个括号里面的可以用子集卷积求到,后面那个可以用异或卷积求到,总的又可以用并卷积求到。于是我们就可以在\(\Theta(w\log ^2w)\)的时间内求到了。其中\(w\)是值域。
\(\text {Code}\)
#include <bits/stdc++.h>
using namespace std;
#define Int register int
#define inv2 500000004
#define mod 1000000007
#define MAXN 1000005
template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T,typename ... Args> inline void read (T &t,Args&... args){read (t);read (args...);}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');}
int lim = 1;
void mul (int &a,int b){a = 1ll * a * b % mod;}
void del (int &a,int b){a = a >= b ? a - b : a + mod - b;}
void add (int &a,int b){a = a + b >= mod ? a + b - mod : a + b;}
void ORFWT (int *A,int type){
for (Int i = 1;i < lim;i <<= 1)
for (Int j = 0;j < lim;j += i << 1)
for (Int k = 0;k < i;++ k)
if (type == 1) add (A[i + j + k],A[j + k]);
else del (A[i + j + k],A[j + k]);
}
void ANDFWT (int *A,int type){
for (Int i = 1;i < lim;i <<= 1)
for (Int j = 0;j < lim;j += i << 1)
for (Int k = 0;k < i;++ k)
if (type == 1) add (A[j + k],A[i + j + k]);
else del (A[j + k],A[i + j + k]);
}
void XORFWT (int *A,int type){
for (Int i = 1;i < lim;i <<= 1)
for (Int j = 0;j < lim;j += i << 1)
for (Int k = 0;k < i;++ k){
int x = A[j + k],y = A[i + j + k];
if (type == 1) A[j + k] = (x + y) % mod,A[i + j + k] = (x + mod - y) % mod;
else A[j + k] = 1ll * (x + y) * inv2 % mod,A[i + j + k] = 1ll * (x + mod - y) * inv2 % mod;
}
}
int n,s,fib[1 << 17],cnt[1 << 17],A[1 << 17],S[1 << 17],f[18][1 << 17],h[1 << 17],sum[1 << 17];
signed main(){
read (n);
fib[0] = 0,fib[1] = cnt[1] = 1;int maxn = 0;
for (Int i = 2;i < (1 << 17);++ i) fib[i] = (fib[i - 1] + fib[i - 2]) % mod,cnt[i] = cnt[i >> 1] + (i & 1);
for (Int i = 1,s;i <= n;++ i) read (s),maxn = max (maxn,s),add (f[cnt[s]][s],1),add (h[s],1),add (sum[s],fib[s]);
int logn = 0;while (lim <= maxn) lim <<= 1,logn ++;
for (Int i = 0;i <= logn;++ i) ORFWT (f[i],1);
for (Int i = 0;i <= logn;++ i){
for (Int j = 0;j < lim;++ j) S[j] = 0;
for (Int j = 0;j <= i;++ j)
for (Int k = 0;k < lim;++ k)
add (S[k],1ll * f[j][k] * f[i - j][k] % mod);
ORFWT (S,-1);
for (Int j = 0;j < lim;++ j) if (cnt[j] == i) add (A[j],S[j]);
}
XORFWT (h,1);
for (Int i = 0;i < lim;++ i) mul (h[i],h[i]);
XORFWT (h,-1);
for (Int i = 0;i < lim;++ i) mul (A[i],fib[i]),mul (h[i],fib[i]);
ANDFWT (A,1),ANDFWT (h,1),ANDFWT (sum,1);
for (Int i = 0;i < lim;++ i) mul (A[i],h[i]),mul (A[i],sum[i]);
ANDFWT (A,-1);
int ans = 0;for (Int i = 1;i < lim;i <<= 1) add (ans,A[i]);
write (ans),putchar ('\n');
return 0;
}
题解 CF914G Sum the Fibonacci的更多相关文章
- CF914G Sum the Fibonacci(FWT,FST)
CF914G Sum the Fibonacci(FWT,FST) Luogu 题解时间 一堆FWT和FST缝合而来的丑陋产物. 对 $ cnt[s_{a}] $ 和 $ cnt[s_{b}] $ 求 ...
- CF914G Sum the Fibonacci (快速沃尔什变换FWT + 子集卷积)
题面 题解 这是一道FWT和子集卷积的应用题. 我们先设 cnt[x] 表示 Si = x 的 i 的数量,那么 这里的Nab[x]指满足条件的 Sa|Sb=x.Sa&Sb=0 的(a,b)二 ...
- 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 ...
- 【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 ...
- 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)\& ...
- LeetCode题解——Two Sum
题目地址:https://oj.leetcode.com/problems/two-sum/ Two Sum Given an array of integers, find two numbers ...
- LeetCode题解之Sum Root to Leaf Numbers
1.题目描述 2.问题分析 记录所有路径上的值,然后转换为int求和. 3.代码 vector<string> s; int sumNumbers(TreeNode* root) { tr ...
随机推荐
- rasa 如何写一个故事
设计故事 在设计故事时,需要考虑两组对话交互:快乐路径和不快乐路径.快乐路径描述用户何时按照您的预期遵循对话流程,并在出现提示时始终提供必要的信息.然而,用户经常会因为问题.闲聊或其他问题而偏离愉快的 ...
- linux centos7 移动文件到指定目录
2021-08-26 在 centos7 环境下怎么移动一个文件到其他的目录下呢? 使用命令 mv 文件名 指定目录 即可完成该操作. 那么怎么将一个文件夹下的内容移动到另一个文件夹下呢?比如有时 ...
- Android Jetpack基本架构之ViewModel+LiveData+DataBinding入门
前提:导入所有依赖,开启DataBinding app的build.gradle android { defaultConfig { ... dataBinding { enabled true } ...
- vue-class和style样式绑定
前言 操作元素的 class 样式列表和 style 内联样式为数据绑定是前端开发中一个常见的需求,这些样式都属于元素的属性 attribute ,因此我们可以通过 v-bind 来动态绑定元素的样式 ...
- EFCore 开始
1. 数据准备 新建类库项目--实体 NuGet安装: Microsoft.EntityFrameworkCore 新建类库项目--DbContext NuGet安装: Microsoft.Entit ...
- Spring系列.Environment接口
Environment 接口介绍 在 Spring 中,Environment 接口主要管理应用程序两个方面的内容:profile 和 properties. profile 可以简单的等同于环境,比 ...
- Dockerfile优化——supervisor服务
一.理解supervisor(supervisor服务不仅在容器中可用,在宿主机中也适用) 1.Dockerfile中的CMD可以指定启动容器后执行的第一个命令,但是当有多个服务进程需要启动的时候,就 ...
- 20210715 noip16
考场 乍一看 T1 像是二分答案,手玩样例发现可以 \(O(k^2)\) 枚举点对,贪心地更新答案,完了?有点不信,先跳了 T2 的形式有点像逆序对,但没啥想法 T3 的式子完全不知道如何处理,一看就 ...
- rtl8188eu 驱动移植
测试平台 宿主机平台:Ubuntu 16.04.6 目标机:iMX6ULL 目标机内核:Linux 4.1.15 rtl8188eu 驱动移植 在网上下载Linux版的驱动源码: wifi驱动的实现有 ...
- Haproxy搭建web集群
目录: 一.常见的web集群调度器 二.Haproxy应用分析 三.Haproxy调度算法原理 四.Haproxy特性 五.Haproxy搭建 Web 群集 一.常见的web集群调度器 目前常见的we ...