CF914G Sum the Fibonacci

解:发现我们对a和b做一个集合卷积,对d和e做一个^FWT,然后把这三个全部对位乘上斐波那契数,然后做&FWT就行了。
#include <bits/stdc++.h>
const int N = , MO = 1e9 + , inv2 = (MO + ) / ;
int n, lm, f[N], a[N], b[N], c[N], cnt[N], d[][N], e[][N];
inline void FWT_or(int *a, int n, int f) {
for(int len = ; len < n; len <<= ) {
for(int i = ; i < n; i += (len << )) {
for(int j = ; j < len; j++) {
a[i + len + j] = ((a[i + len + j] + f * a[i + j]) % MO + MO) % MO;
}
}
}
return;
}
inline void FWT_and(int *a, int n, int f) {
for(int len = ; len < n; len <<= ) {
for(int i = ; i < n; i += (len << )) {
for(int j = ; j < len; j++) {
a[i + j] = ((a[i + j] + f * a[i + len + j]) % MO + MO) % MO;
}
}
}
return;
}
inline void FWT_xor(int *a, int n, int f) {
for(int len = ; len < n; len <<= ) {
for(int i = ; i < n; i += (len << )) {
for(int j = ; j < len; j++) {
int t = a[i + len + j];
a[i + len + j] = (a[i + j] - t + MO) % MO;
a[i + j] = (a[i + j] + t) % MO;
if(f == -) {
a[i + len + j] = 1ll * a[i + len + j] * inv2 % MO;
a[i + j] = 1ll * a[i + j] * inv2 % MO;
}
}
}
}
return;
}
int main() {
int n;
scanf("%d", &n);
for(int i = , x; i <= n; i++) {
scanf("%d", &x);
a[x]++;
}
n = ;
lm = << ;
cnt[] = f[] = ;
for(int i = ; i < lm; i++) {
f[i] = (f[i - ] + f[i - ]) % MO;
cnt[i] = cnt[i - (i & (-i))] + ;
}
memcpy(c, a, lm * sizeof(int));
for(int i = ; i < lm; i++) {
d[cnt[i]][i] = a[i];
}
for(int i = ; i <= n; i++) {
FWT_or(d[i], lm, );
}
for(int i = ; i <= n; i++) {
for(int j = ; j <= i; j++) {
for(int s = ; s < lm; s++) {
e[i][s] = (e[i][s] + 1ll * d[j][s] * d[i - j][s] % MO) % MO;
}
}
}
for(int i = ; i <= n; i++) {
FWT_or(e[i], lm, -);
}
for(int i = ; i < lm; i++) {
b[i] = 1ll * e[cnt[i]][i] * f[i] % MO;
}
FWT_xor(c, lm, );
for(int i = ; i < lm; i++) {
c[i] = 1ll * c[i] * c[i] % MO;
}
FWT_xor(c, lm, -);
for(int i = ; i < lm; i++) {
c[i] = 1ll * c[i] * f[i] % MO;
}
for(int i = ; i < lm; i++) {
a[i] = 1ll * a[i] * f[i] % MO;
}
FWT_and(a, lm, );
FWT_and(b, lm, );
FWT_and(c, lm, );
for(int i = ; i < lm; i++) {
a[i] = 1ll * a[i] * b[i] % MO * c[i] % MO;
}
FWT_and(a, lm, -);
int ans = ;
for(int i = ; i < lm; i <<= ) {
ans = (ans + a[i]) % MO;
}
printf("%d\n", ans);
return ;
}
AC代码
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
题目传送门 题目大意 给出\(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 (快速沃尔什变换FWT + 子集卷积)
题面 题解 这是一道FWT和子集卷积的应用题. 我们先设 cnt[x] 表示 Si = x 的 i 的数量,那么 这里的Nab[x]指满足条件的 Sa|Sb=x.Sa&Sb=0 的(a,b)二 ...
- 【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)\& ...
- 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 数组的位置: 子集卷积时不能 ...
随机推荐
- ubuntu下解压rar文件
ubuntu 下rar解压工具安装方法: 压缩功能 sudo apt-get install rar 1 解压功能 sudo apt-get install unrar 1 使用 可以直接在UI界面使 ...
- Sublime Text 3 常用插件 —— SFTP
在 Win 下常用 Xftp 软件来和远程服务传递文件,但是要是在项目开发的时候频繁的将远程文件拖到本地编辑然后再传回远程服务器,那真是麻烦无比,但是Sublime中SFTP插件,它让这世界美好了许多 ...
- MongoDB副本集及C#程序的连接配置
1.副本集 高可用是绝大多数数据库管理系统的核心目标之一.如果要想生产数据在发生故障后依然可用,就需要确保为生产数据库多部署一台服务器.MongoDB副本集提供了数据的保护.高可用和灾难恢复的机制. ...
- Python文件操作之把臂入林
文件操作1.打开文件open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=Tru ...
- mysql解决select * from 表名 (where + 约束条件为空)
mysql解决select * from 表名 (where + 约束条件为空),示例如下: SELECT * from tableName WHERE name is NULL; 从 tableNa ...
- Mysql数据库基础学习笔记
Mysql数据库基础学习笔记 1.mysql查看当前登录的账户名以及数据库 一.单表查询 1.创建数据库yuzly,创建表fruits 创建表 ) ) ,) NOT NULL,PRIMARY KEY( ...
- 我的第一个python web开发框架(27)——定制ORM(三)
在上一章中,我们已经创建好ORM的基类了,接下来要做的就是将基类的常用方法一一实现. 首先我们来看看之前项目中,最常见的获取指定主键的记录实体 @get('/api/product/<id:in ...
- Git与SVN交叉使用
将本地git项目添加到远程svn中 git svn [svnprojpath] svnprojpath为原创svn项目路径 -- 文件夹路径,你要放到哪个文件夹 官方文档中带有-s参数,但我这边加了会 ...
- 3.18 总结 java 基础语法
- Redis常用数据结构
Redis常用数据结构包括字符串(strings),列表(lists),哈希(hashes),集合(sets),有序集合(sorted sets). redis的key最大不能超过512M,可通过re ...