CF914G Sum the Fibonacci(FWT模板+子集卷积)
title
题目
solution
(sa∣sb)&sc&(sd⊕se)=2i,i∈Z;sa&sb=0(s_a|s_b)\&s_c\&(s_d⊕s_e)=2^i,i∈Z;s_a\&s_b=0(sa∣sb)&sc&(sd⊕se)=2i,i∈Z;sa&sb=0
令i=sa∣sb,j=sc,d=sd⊕sei=s_a|s_b,j=s_c,d=s_d⊕s_ei=sa∣sb,j=sc,d=sd⊕se
∑x∑i&j&k=xfibi∗fibj∗fibk∗(∑sa∣sb=i,sa&sb=01)∗(∑sc=j1)∗(∑sd⊕se=k1)\sum_{x}\sum_{i\&j\&k=x}fib_i*fib_j*fib_k*(\sum_{s_a|s_b=i,s_a\&s_b=0}1)*(\sum_{s_c=j}1)*(\sum_{s_d⊕s_e=k}1)x∑i&j&k=x∑fibi∗fibj∗fibk∗(sa∣sb=i,sa&sb=0∑1)∗(sc=j∑1)∗(sd⊕se=k∑1)
令fi=(∑sa∣sb=i,sa&sb=01),gj=(∑sc=j1),hk=(∑sd⊕se=k1)f_i=(\sum_{s_a|s_b=i,s_a\&s_b=0}1),g_j=(\sum_{s_c=j}1),h_k=(\sum_{s_d⊕s_e=k}1)fi=(∑sa∣sb=i,sa&sb=01),gj=(∑sc=j1),hk=(∑sd⊕se=k1)
fff就是子集卷积直接做;ggg不做操作;hhh就是常规的FWT_xorFWT\_xorFWT_xor卷积
最后三个一起带着各自的斐波拉契权值,做个FWT_andFWT\_andFWT_and卷积即可
code
#include <cstdio>
#include <cstring>
#define mod 1000000007
#define int long long
#define maxn 1 << 18
int n, ret, inv = ( mod + 1 ) >> 1;
int f[maxn], g[maxn], h[maxn], tmp[maxn], ans[maxn], fib[maxn];
int dp[20][maxn];void FWT_or( int *v, int opt ) {for( int i = 1;i < maxn;i <<= 1 )for( int j = 0;j < maxn;j += ( i << 1 ) )for( int k = 0;k < i;k ++ )v[j + k + i] = ( v[j + k + i] + v[j + k] * opt + mod ) % mod;
}void FWT_and( int *v, int opt ) {for( int i = 1;i < maxn;i <<= 1 ) for( int j = 0;j < maxn;j += ( i << 1 ) )for( int k = 0;k < i;k ++ )v[j + k] = ( v[j + k] + v[j + k + i] * opt + mod ) % mod;;
}void FWT_xor( int *v, int opt ) {for( int i = 1;i < maxn;i <<= 1 )for( int j = 0;j < maxn;j += ( i << 1 ) )for( int k = 0;k < i;k ++ ) {int x = v[j + k], y = v[j + k + i];v[j + k] = ( x + y ) % mod;v[j + k + i] = ( x - y + mod ) % mod;if( opt == -1 ) {v[j + k] = v[j + k] * inv % mod;v[j + k + i] = v[j + k + i] * inv % mod;}}
}signed main() {scanf( "%lld", &n );for( int i = 1, x;i <= n;i ++ ) {scanf( "%lld", &x );f[x] ++, g[x] ++, h[x] ++;}fib[1] = 1;for( int i = 2;i < maxn;i ++ )fib[i] = ( fib[i - 1] + fib[i - 2] ) % mod;for( int i = 0;i < maxn;i ++ )dp[__builtin_popcount( i )][i] = f[i], f[i] = 0;n = 18;for( int i = 0;i < n;i ++ )FWT_or( dp[i], 1 );for( int i = 0;i < n;i ++ ) {memset( tmp, 0, sizeof( tmp ) );for( int j = 0;j <= i;j ++ )for( int k = 0;k < maxn;k ++ )tmp[k] = ( tmp[k] + dp[j][k] * dp[i - j][k] % mod ) % mod;FWT_or( tmp, -1 );for( int j = 0;j < maxn;j ++ )if( __builtin_popcount( j ) == i )f[j] = ( f[j] + tmp[j] ) % mod;}FWT_xor( h, 1 );for( int i = 0;i < maxn;i ++ )h[i] = h[i] * h[i] % mod;FWT_xor( h, -1 ); for( int i = 0;i < maxn;i ++ )f[i] = f[i] * fib[i] % mod, g[i] = g[i] * fib[i] % mod, h[i] = h[i] * fib[i] % mod;FWT_and( f, 1 ), FWT_and( g, 1 ), FWT_and( h, 1 );for( int i = 0;i < maxn;i ++ )ans[i] = f[i] * g[i] % mod * h[i] % mod;FWT_and( ans, -1 );for( int i = 1;i < maxn;i <<= 1 )ret = ( ret + ans[i] ) % mod;printf( "%lld\n", ret );return 0;
}
CF914G Sum the Fibonacci(FWT模板+子集卷积)相关推荐
- 【学习笔记】FWT,子集卷积
文章目录 1.概述 2.思想 3.按位或卷积 3.1.定义 3.2.正变换 3.3.逆变换 3.4.代码实现 4.按位与卷积 4.1.定义 4.2.正变换 4.3.逆变换 4.4.代码实现 5.按位异 ...
- CF838C-Future Failure【dp,子集卷积】
正题 题目链接:https://www.luogu.com.cn/problem/CF838C 题目大意 一个字符串sss,两个人轮流操作,每次每个人可以选择删掉一个字符或者重排列这个字符串,但是不能 ...
- 洛谷P6097:【模板】子集卷积(FWT)
解析 完全可以当一道 DP 题而不是模板来做. 首先第一个条件: i∣j=ki|j=ki∣j=k 比较简单,直接上FWT板子即可. 考虑第二个条件:i&j=0i\&j=0i&j ...
- P6097-[模板]子集卷积
正题 题目链接:https://www.luogu.com.cn/problem/P6097 题目大意 长度为2n2^n2n的序列a,ba,ba,b求一个ccc满足 ck=∑i∣j=k,i&j ...
- 图像处理-模板、卷积的整理
一:什么是卷积 离散卷积的数学公式可以表示为如下形式: f(x) = - 其中C(k)代表卷积操作数,g(i)代表样本数据, f(x)代表输出结果. 举例如下: 假设g(i)是一个一维的函数,而且代表 ...
- leetcode 416. Partition Equal Subset Sum | 416. 分割等和子集(Java)
题目 https://leetcode.com/problems/partition-equal-subset-sum/ 题解 乍一看是背包问题,但不同的是,本题要求结果等于某值,背包要求结果小于某值 ...
- 快速沃尔什变换(FWT)及K进制异或卷积快速子集变换(FST)讲解
前言: $FWT$是用来处理位运算(异或.与.或)卷积的一种变换.位运算卷积是什么?形如$f[i]=\sum\limits_{j\oplus k==i}^{ }g[j]*h[k]$的卷积形式(其中$\ ...
- 【Atcoder agc020 C】Median Sum,序列子集和中位数,bitset,01背包
problem C - Median Sum / Time Limit: 2 sec / Memory Limit: 512 MB Score : 700 points Problem Stateme ...
- 动态规划法(三)子集和问题(Subset sum problem)
继续讲故事~~ 上次讲到我们的主人公丁丁,用神奇的动态规划法解决了杂货店老板的两个找零钱问题,得到了老板的肯定.之后,他就决心去大城市闯荡了,看一看外面更大的世界. 这天,丁丁刚回到家,他 ...
最新文章
- 遗传算法就是创造力的本质
- linux重启后出现control+D错误的解决
- 第十二节: EF的三种模式(二) 之 ModelFirst模式(SQLServer为例)
- FutureV接口CallableV接口的使用
- 【OpenCV】OpenCV实战从入门到精通之 -- 基本图像绘制
- pygame写的弹力球
- Leetcode 509. Fibonacci Number
- 如何激活Microsoft Office 2010?
- 产品经理面试问题及答案大全《一》
- 易飞ERP工作流解决方案之【第三方OA系统集成】
- java 图片缩放 模糊问题_java – PDFBox中的缩放图像模糊
- 全国哀悼日,网站变黑白完美兼容IE,亲测有效
- Android 多点触控
- 【Python web 开发】 bottle 简单教程 (四)
- Android 游戏引擎libgdx之Box2D Hello Box2D
- 3万字长文带你轻松入门视觉Transformer
- 安装微信小程序开发者工具
- python学习(二十一)
- keil 烧录时 Full Chip Erase Failed问题
- RSA分段加密/解密 nodejs 和java联调
热门文章
- 一文读懂 AVL 树
- PL/SQL Developer使用技巧总结
- php返回一个变量,PHP从另一个文件获取变量
- mysql 导入文件夹_MySQL-导入与导出
- android canvas_Android 如何实现气泡选择动画
- oracle未找到时区,Oracle ADF 未找到时区错误
- 7500 cpuz跑分 i5_核心硬盘 i5 7500性能测试_DIY攒机酷品测试-中关村在线
- python中merge函数怎么用_Python Merge函数原理及用法解析
- java的正则表达式 CPU_小心踩雷!一个小小的正则表达式竟把CPU拖垮......
- C++ 实现无向图的最小生成树Prim算法(附完整代码)