解:发现我们对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的更多相关文章

  1. CF914G Sum the Fibonacci(FWT,FST)

    CF914G Sum the Fibonacci(FWT,FST) Luogu 题解时间 一堆FWT和FST缝合而来的丑陋产物. 对 $ cnt[s_{a}] $ 和 $ cnt[s_{b}] $ 求 ...

  2. 题解 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 ...

  3. CF914G Sum the Fibonacci FWT、子集卷积

    传送门 一道良心的练习FWT和子集卷积的板子-- 具体来说就是先把所有满足\(s_a \& s_b = 0\)的\(s_a \mid s_b\)的值用子集卷积算出来,将所有\(s_a \opl ...

  4. CF914G Sum the Fibonacci (快速沃尔什变换FWT + 子集卷积)

    题面 题解 这是一道FWT和子集卷积的应用题. 我们先设 cnt[x] 表示 Si = x 的 i 的数量,那么 这里的Nab[x]指满足条件的 Sa|Sb=x.Sa&Sb=0 的(a,b)二 ...

  5. 【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 ...

  6. 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 | ...

  7. 【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)\& ...

  8. 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 ...

  9. CF 914 G Sum the Fibonacci —— 子集卷积,FWT

    题目:http://codeforces.com/contest/914/problem/G 其实就是把各种都用子集卷积和FWT卷起来算即可: 注意乘 Fibonacci 数组的位置: 子集卷积时不能 ...

随机推荐

  1. 章节九、3-Desired Capabilities介绍

    一.Desired Capabilities是selenium webdrive中已经写好的一个类,我们可以通过它来告诉selenium webdrive在Desired Capabilities是什 ...

  2. IntelliJ IDEA简介及简单操作

    IntelliJ IDEA简介         IDEA 全称IntelliJ IDEA,是用于java语言开发的集成环境(也可用于其他语言),IntelliJ在业界被公认为最好的java开发工具之一 ...

  3. selenium-弹窗操作(八)

    本次以笔者公告栏的 打赏 弹窗为例 对弹窗中的一些操作进行封装后,在测试中使用 作用:减少对弹窗反复操作时进行定位的麻烦,以后使用中都直接调用即可达到目的 # coding=utf-8 from se ...

  4. 从0开始的Python学习010return语句&DocStrings

    return语句 return语句用来从一个函数中 返回 即跳出函数.当然也可以从函数中返回一个值. #return 语句从一个函数返回 即跳出函数.我们也可选从函数返回一个值 def maximum ...

  5. 尝试Java,从入门到Kotlin(上)

    之前一直使用C#开发,最近由于眼馋Java生态环境,并借着工作服务化改造的契机,直接将新项目的开发都转到Java上去.积攒些Java开发经验,应该对.NET开发也会有所启发和益处. 从理论上说,Jav ...

  6. 【原】Java学习笔记025 - 内部类

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // 内部类(嵌套类): ...

  7. c/c++ 网络编程 文件传输

    网络编程 文件传输 1,文件发送端 2,文件接收端 文件发送端: #include <iostream> #include <string.h> #include <sy ...

  8. Zabbix常见触发器表达式

    Zabbix trigger是zabbix 进行告警通知的设定条件 ,当监控获取的值触发了设定的条件时,会按照触发器的设定,执行相应的action 操作 .在zabbix中为了比较方便的设定各种条件, ...

  9. 事务的ACID属性,图解并发事务带来问题以及事务的隔离级别

    事务的概述 事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行. 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源.通过将一组相关操作组 ...

  10. C#基础知识之特性

    一.什么是特性 个人理解:特性本质上也是有一种类,通过添加特性,就可以实例化这个特性类:添加特性就是在类.方法.结构.枚举.组件等上面加一个标签,使这些类.方法.结构.枚举.组件等具有某些统一的特征, ...