题目:http://codeforces.com/contest/914/problem/G

其实就是把各种都用子集卷积和FWT卷起来算即可;

注意乘 Fibonacci 数组的位置;

子集卷积时不能一边做一边更新卷积的数组!

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
int Max(int x,int y){return x>y?x:y;}
int const xm=(<<)+,mod=1e9+;
int n,p[xm],F[xm],f[][xm],g[xm],h[xm],t[xm],bin[],cnt[xm],inv2,lm;
ll pw(ll a,int b){ll ret=; for(;b;b>>=,a=a*a%mod)if(b&)ret=ret*a%mod; return ret;}
int upt(int x){while(x>=mod)x-=mod; while(x<)x+=mod; return x;}
int cal(int s){int ret=; while(s)ret+=(s&),s>>=; return ret;}
int get(int x){int ret=; while(x)ret++,x>>=; return ret;}
void init()
{
F[]=; F[]=;
for(int i=;i<bin[lm];i++)F[i]=upt(F[i-]+F[i-]);
}
void fmt(int *a,int tp)
{
for(int d=;d<bin[lm];d<<=)
for(int s=;s<bin[lm];s++)
if(s&d)a[s]=upt(a[s]+a[s^d]*tp);
}
void fwt1(int *a,int tp)//&
{
for(int mid=;mid<bin[lm];mid<<=)
for(int j=,len=(mid<<);j<bin[lm];j+=len)
for(int k=;k<mid;k++)
a[j+k]=upt(a[j+k]+a[j+mid+k]*tp);
}
void fwt2(int *a,int tp)//^
{
for(int mid=;mid<bin[lm];mid<<=)
for(int j=,len=(mid<<);j<bin[lm];j+=len)
for(int k=;k<mid;k++)
{
int x=a[j+k],y=a[j+mid+k];
a[j+k]=upt(x+y); a[j+mid+k]=upt(x-y);
if(tp==-)a[j+k]=(ll)a[j+k]*inv2%mod,a[j+mid+k]=(ll)a[j+mid+k]*inv2%mod;
}
}
int main()
{
n=rd(); lm=;
bin[]=; for(int i=;i<=lm;i++)bin[i]=bin[i-]*;
for(int s=;s<bin[lm];s++)cnt[s]=cal(s);
int mx=;
for(int i=,x;i<=n;i++)x=rd(),p[x]++,mx=Max(mx,x);
lm=get(mx)+; init();
for(int s=;s<bin[lm];s++)f[cnt[s]][s]=p[s];
for(int i=;i<lm;i++)fmt(f[i],);
/*
for(int i=1;i<lm;i++)
{
for(int j=0;j<=i;j++)
for(int s=0;s<bin[lm];s++)
f[i][s]=(f[i][s]+(ll)f[j][s]*f[i-j][s])%mod;
for(int s=0;s<bin[lm];s++)if(cnt[s]!=i)f[i][s]=0;
}
for(int i=0;i<lm;i++)fmt(f[i],-1);
for(int s=0;s<bin[lm];s++)g[s]=f[cnt[s]][s];
*/
for(int i=;i<lm;i++)
{
memset(t,,sizeof t);
for(int j=;j<=i;j++)
for(int s=;s<bin[lm];s++)
t[s]=(t[s]+(ll)f[j][s]*f[i-j][s])%mod;
fmt(t,-);
for(int s=;s<bin[lm];s++)
if(cnt[s]==i)g[s]=upt(g[s]+t[s]);
} for(int s=;s<bin[lm];s++)h[s]=p[s];
inv2=pw(,mod-); fwt2(h,);
for(int s=;s<bin[lm];s++)h[s]=(ll)h[s]*h[s]%mod;
fwt2(h,-); for(int s=;s<bin[lm];s++)g[s]=(ll)g[s]*F[s]%mod;
for(int s=;s<bin[lm];s++)h[s]=(ll)h[s]*F[s]%mod;
for(int s=;s<bin[lm];s++)p[s]=(ll)p[s]*F[s]%mod;
fwt1(g,); fwt1(h,); fwt1(p,);
for(int s=;s<bin[lm];s++)g[s]=(ll)g[s]*h[s]%mod*p[s]%mod;
fwt1(g,-); int ans=;
for(int i=;i<lm;i++)ans=upt(ans+g[bin[i]]);
printf("%d\n",ans);
return ;
}

CF 914 G Sum the Fibonacci —— 子集卷积,FWT的更多相关文章

  1. CF 914G Sum the Fibonacci——子集卷积

    题目:http://codeforces.com/contest/914/problem/G 第一个括号可以子集卷积:第三个括号可以用 FWT 异或卷积:这样算出选两个数组成 x 的方案数:三个部分的 ...

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

  3. @总结 - 2@ 位运算卷积/子集卷积 —— FWT/FMT

    目录 @0 - 参考资料@ @1 - 异或卷积概念及性质@ @2 - 快速沃尔什正变换(异或)@ @3 - 快速沃尔什逆变换(异或)@ @4 - 与卷积.或卷积@ @5 - 参考代码实现@ @6 - ...

  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 FWT、子集卷积

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

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

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

  8. UOJ #348 州区划分 —— 状压DP+子集卷积

    题目:http://uoj.ac/problem/348 一开始可以 3^n 子集DP,枚举一种状态的最后一个集合是什么来转移: 设 \( f[s] \) 表示 \( s \) 集合内的点都划分好了, ...

  9. Future Failure CodeForces - 838C (博弈论,子集卷积)

    大意: 两人轮流操作一个长$n$, 只含前$k$种小写字母的串, 每次操作删除一个字符或者将整个串重排, 每次操作后得到的串不能和之前出现过的串相同, 求多少种串能使先手必胜. 找下规律发现$n$为奇 ...

随机推荐

  1. 宇视摄像机/NVR OCX插件插件安装出现:Failed to register ocx, error code 14001 错误的解决方法

    最近在使用EasyNVR接入海康.宇视的摄像机进行景观直播的项目时,需要进入宇视设备进行音视频编码参数的调整,要说呢,海康的产品好就是要好很多: 海康的设备后台管理页面,不需要装插件也能进去,而且能调 ...

  2. (转)如何使VMware ip与本机ip处于同一网段

    如何使VMware ip与本机ip处于同一网段 原创 2017年05月08日 17:28:56 1287 首先确认本机ip  可以看出一下信息: 本机ip: 192.168.1.162 网关:192. ...

  3. springboot带分页的条件查询

    QueryDSL简介 QueryDSL仅仅是一个通用的查询框架,专注于通过Java API构建类型安全的SQL查询. Querydsl可以通过一组通用的查询API为用户构建出适合不同类型ORM框架或者 ...

  4. 利用CocoaPods管理本地工程和发布开源框架

    发布自己三方框架 发布云端库 1.创建spec pod spec create xxx 2.编辑spec s.name:名称,pod search 搜索的关键词,注意这里一定要和.podspec的名称 ...

  5. [原创]java WEB学习笔记15:域对象的属性操作(pageContext,request,session,application) 及 请求的重定向和转发

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  6. mutation与action

    mutation 作用: 更改state的状态 说明: 每个mutation对象都有字符串类型(type)与回调函数,在回调函数内进行状态修改,回调函数的第一个参数为state eg: mutatio ...

  7. Spring Cloud之统一fallback接口

    每个方法都配备一个fallback方法 不利于开发的 用类的方式 并且整个方法都是在同一个线程池里面的 主要对于client的修改: pom: <project xmlns="http ...

  8. Spring Cloud之DiscoveryClient使用

    主要修改zk order的代码: package com.toov5.api.controller; import java.util.List; import org.springframework ...

  9. JAVA强制类型转换(转载+自己的感想) - stemon

    JAVA强制类型转换(转载+自己的感想) - stemon 时间 2013-10-29 15:52:00  博客园-Java原文  http://www.cnblogs.com/stemon/p/33 ...

  10. linux开机过程

    一.MBR(main boot record)主引导记录 主引导记录位于0盘面,0磁道,0扇区,早期由512个字节组成. 其中446个字节是boot loader程序.Boot Loader是在操作系 ...