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 数组的位置: 子集卷积时不能 ...
随机推荐
- 使用GRPC远程服务调用
远程过程调用(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通信协议.该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程.如 ...
- 【Linux】【Apatch Tomcat】Linux、CentOS7安装最新版Apartch Tomcat环境
1.前言 相当嫌弃,博客园搞掉了我快写完的 Tomcat. 请先安装 :[Linux][Java]CentOS7安装最新版Java1.8.191运行开发环境 虽然安装Tomcat没啥技术,但是还是记录 ...
- 【自动化测试&爬虫系列】Selenium Webdriver
文章来源:公众号-智能化IT系统. 一. Selenium Webdriver技术介绍 1. 简介 selenium Webdriver是一套针对不同浏览器而开发的web应用自动化测试代码库.使用这套 ...
- 【原】Java学习笔记002 - JAVA SE编码规范
/* * 编码规范: * 1.所有的命名遵循"见名知意"的原则 * 2.所有的命名不允许使用汉字或拼音 * 3.Java的工程命名建议使用小写,比如:oa.crm.cms... * ...
- 有两个表A和B,均有key和value两个字段,如果B的key在A中也有,就把B的value替换为A中对应的value
update B b set b.value=(select max(a.value) from A a where b.key=a.key) from A c where b.key=c.key) ...
- GitHub下载克隆clone指定的分支tag代码
需求描述: 这边有很多tag分支版本的代码,我想克隆下载指定版本到我服务器上面 例如:我想下载tag:1.4.1的代码 解决方法: 命令:git clone --branch [tags标签] [gi ...
- python文章装饰器理解12步
1. 函数 在python中,函数通过def关键字.函数名和可选的参数列表定义.通过return关键字返回值.我们举例来说明如何定义和调用一个简单的函数: def foo(): return 1 fo ...
- java实现简单的solr查询
SolrQuery类是实现solr查询的类. @Test public void testSelect() { String url = "http://localhost:8081/sol ...
- python进阶之正则表达式
概念: 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. 目的? 给定一个正则表 ...
- 验证二叉搜索树的golang实现
给定一个二叉树,判断其是否是一个有效的二叉搜索树. 一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是二叉搜索树. ...