传送门


一道良心的练习FWT和子集卷积的板子……

具体来说就是先把所有满足\(s_a \& s_b = 0\)的\(s_a \mid s_b\)的值用子集卷积算出来,将所有\(s_a \oplus s_b\)用xor卷积算出来,把斐波那契数代进去,然后将三个数组and卷积,最后取\(2^i (i \in Z)\)的位置的答案的和

#include<bits/stdc++.h>
//this code is written by Itst
using namespace std; int read(){
int a = 0; char c = getchar();
while(!isdigit(c)) c = getchar();
while(isdigit(c)){
a = a * 10 + c - 48;
c = getchar();
}
return a;
} const int _ = (1 << 17) + 3 , MOD = 1e9 + 7;
#define lowbit(x) (x & (-x))
int fib[_] , arr[_] , cnt1[_] , Or[18][_] , ansOr[_] , tmp[_] , And[_] , Xor[_] , N; void orFWT(int *arr , long long tp){
for(int i = 0 ; i < 17 ; ++i)
for(int j = 0 ; j < 1 << 17 ; j += 1 << (i + 1))
for(int k = 0 ; k < 1 << i ; ++k)
arr[(1 << i) + j + k] = (arr[(1 << i) + j + k] + tp * arr[j + k] + MOD) % MOD;
} void andFWT(int *arr , long long tp){
for(int i = 0 ; i < 17 ; ++i)
for(int j = 0 ; j < 1 << 17 ; j += 1 << (i + 1))
for(int k = 0 ; k < 1 << i ; ++k)
arr[j + k] = (arr[j + k] + tp * arr[(1 << i) + j + k] + MOD) % MOD;
} void xorFWT(int *arr , long long tp){
for(int i = 0 ; i < 17 ; ++i)
for(int j = 0 ; j < 1 << 17 ; j += 1 << (i + 1))
for(int k = 0 ; k < 1 << i ; ++k){
int x = arr[j + k] , y = arr[(1 << i) + j + k];
arr[j + k] = (x + y) % MOD;
arr[(1 << i) + j + k] = (x - y + MOD) % MOD;
if(tp == -1){
if(arr[j + k] & 1) arr[j + k] += MOD;
arr[j + k] >>= 1;
if(arr[(1 << i) + j + k] & 1) arr[(1 << i) + j + k] += MOD;
arr[(1 << i) + j + k] >>= 1;
}
}
} void init(){
for(int i = 1 ; i < 1 << 17 ; ++i)
cnt1[i] = cnt1[i - lowbit(i)] + 1;
fib[1] = 1;
for(int i = 2 ; i < 1 << 17 ; ++i)
fib[i] = (fib[i - 1] + fib[i - 2]) % MOD;
} int main(){
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
//freopen("out","w",stdout);
#endif
init();
N = read();
for(int i = 1 ; i <= N ; ++i){
int p = read();
++arr[p]; ++Or[cnt1[p]][p];
}
memcpy(And , arr , sizeof(arr)); memcpy(Xor , arr , sizeof(arr));
for(int i = 0 ; i <= 17 ; ++i)
orFWT(Or[i] , 1);
for(int i = 0 ; i <= 17 ; ++i){
memset(tmp , 0 , sizeof(tmp));
for(int j = 0 ; j <= i ; ++j)
for(int k = 0 ; k < 1 << 17 ; ++k)
tmp[k] = (tmp[k] + 1ll * Or[j][k] * Or[i - j][k]) % MOD;
orFWT(tmp , -1);
for(int k = 0 ; k < 1 << 17 ; ++k)
if(cnt1[k] == i)
ansOr[k] = tmp[k];
}
xorFWT(Xor , 1);
for(int i = 0 ; i < 1 << 17 ; ++i)
Xor[i] = 1ll * Xor[i] * Xor[i] % MOD;
xorFWT(Xor , -1);
for(int i = 0 ; i < 1 << 17 ; ++i){
ansOr[i] = 1ll * ansOr[i] * fib[i] % MOD;
And[i] = 1ll * And[i] * fib[i] % MOD;
Xor[i] = 1ll * Xor[i] * fib[i] % MOD;
}
andFWT(ansOr , 1); andFWT(And , 1); andFWT(Xor , 1);
for(int i = 0 ; i < 1 << 17 ; ++i)
And[i] = 1ll * ansOr[i] * And[i] % MOD * Xor[i] % MOD;
andFWT(And , -1);
int ans = 0;
for(int i = 1 ; i < 1 << 17 ; i <<= 1)
ans = (ans + And[i]) % MOD;
cout << ans;
return 0;
}

CF914G Sum the Fibonacci FWT、子集卷积的更多相关文章

  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 (快速沃尔什变换FWT + 子集卷积)

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

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

  4. Comet Contest#11 F arewell(DAG计数+FWT子集卷积)

    传送门. 题解: 4月YY集训时做过DAG计数,和这个基本上是一样的,但是当时好像直接暴力子集卷积,不然我省选时不至于不会,这个就多了个边不选的概率和子集卷积. DAG计数是个套路来的,利用的是DAG ...

  5. CF838C(博弈+FWT子集卷积+多项式ln、exp)

    传送门: http://codeforces.com/problemset/problem/838/C 题解: 如果一个字符串的排列数是偶数,则先手必胜,因为如果下一层有后手必赢态,直接转移过去,不然 ...

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

  7. CF914G Sum the Fibonacci

    解:发现我们对a和b做一个集合卷积,对d和e做一个^FWT,然后把这三个全部对位乘上斐波那契数,然后做&FWT就行了. #include <bits/stdc++.h> , MO ...

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

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

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

随机推荐

  1. 斐波那契数列第n项的值及前n项之和

    <script>// 算法题 // 题1:斐波那契数列:1.1.2.3.5.8.13.21...// // 一.斐波那契数列第n项的值 // // 方法一//递归的写法function a ...

  2. 阿里云和腾讯云免费SSL证书 专题

    阿里云部署SSL证书 http://www.cnblogs.com/sslwork/p/5984167.html 查找中间证书 为了确保兼容到所有浏览器,我们必须在阿里云上部署中间证书,如果不部署证书 ...

  3. 使用box-shadow进行画图(性能优化终结者)

    最近突然想做一些好玩的东西,找来找去,想到了之前曾经在网上看到过有人用box-shadow画了一副蒙娜丽莎出来感觉这个挺有意思,正好趁着周末,自己也搞一波 前言 在线地址: 优化前的版本优化后的版本源 ...

  4. safari浏览器模拟ipone,ipad以及其他浏览器版本

    1.打开safari浏览器中的偏好设置 2.在偏好设置中,选择高级,勾选在菜单栏中显示开发菜单 3.打开开发,进入响应式设计模式 4.可以选择iphone 或ipad.浏览器等不同模式,进行模拟 5. ...

  5. Scrapy爬虫框架第八讲【项目实战篇:知乎用户信息抓取】--本文参考静觅博主所写

    思路分析: (1)选定起始人(即选择关注数和粉丝数较多的人--大V) (2)获取该大V的个人信息 (3)获取关注列表用户信息 (4)获取粉丝列表用户信息 (5)重复(2)(3)(4)步实现全知乎用户爬 ...

  6. Backbone.js 和 Nodejs 的一些共同点搞不清楚

    前端方面 我用 Backbone.js 做过前端的开发,印象里就是后端按模型对象的属性把 JSON 数据发过来,我写在模板里渲染就好了 模板加载( underscore.js ) 建立模型 渲染视图 ...

  7. 在腾讯云(windows)上搭建node.js服务器

    1:安装Node.js 使用MSI文件,并按照提示安装node.js,默认情况下,安装程序将 Node.js 发行到 C:\Program Files\nodejs. 但这里我们需要修改安装路径到:D ...

  8. 用php过滤文字中的表情字符

    很多时候,如果文字中夹带表情,那么这些文字的处理就会出现问题,例如,如果一个用户的昵称带有表情,那么我怎么把这个昵称转换为拼音呢?在实际的开发中,我遇到了这个个问题,先是找到了 https://git ...

  9. spring boot整合shiro

    安全框架Shiro和Spring Security比较,本文主要围绕Shiro进行学习 一 Shiro 是一个强大而灵活的开源安全框架,能够清晰的处理认证 授权 管理会话以及,密码加密 01 .认证与 ...

  10. [SQL Server]用 C# 在 LinqPad 建立 Linked Server 跨服务器数据库操作

    在涉及老项目数据迁移的时候,数据库结构已经完全发生变化,而且需要对老数据进行特殊字段的处理,而且数据量较大,使用Navicat导出单表之后,一个表数据大概在100多万的样子,直接导出SQL执行根本行不 ...