题目链接

首先\(C(n,m)\)为奇数当且仅当\(n\&m=m\)。

简要证明: 因为是\(mod\ 2\),考虑Lucas定理。

在\(mod\ 2\)的情况下\(C(n,m)\)最后只会化成4种情况:\(C(0,1),C(0,0),C(1,0),C(1,1)\)。

后三种情况都是1,\(C(0,1)\)不存在(=0)。所以如果\(C(n,m)mod\ 2\)为偶数,那么在Lucas的过程中一定出现了\(C(0,1)\)。

\(mod\ 2\)的过程容易想到位运算。

由\(C(n,m)mod\ 2=C(n\%2,m\%2)*C(n/2,m/2)=C(n\&1,m\&1)*C(n>>1,m>>1)\)

可知,若\(C(n,m)\)为奇数,那么\(m\)一定是\(n\)二进制1的子集(否则存在\(C(0,1)\))。

因为要满足\(n\&m=m\),所以题意即为,有多少个\(a\)的子序列\(b\),满足\(b_i\&b_{i+1}=b_{i+1}\)。

令\(f[i]\)表示以\(A[i]\)结尾的合法子序列数。

那么有两种显然的方式:

  1. 枚举\(i\),\(ans+=f[i]\),再更新后面满足 \(A[j]\)的二进制位是\(A[i]\)二进制位的子集 的\(j\),\(f[j]+=f[i]\)。
  2. 枚举\(i\),枚举\(j\),求\(f[i]=\sum_{j<i,A[j]是A[i]的超集}f[j]\),然后\(ans+=f[i]\)。

两种都是枚举子集。第一种是不需要查询,转移\(O(3^{18})\);第二种是查询\(O(3^{18})\),不需要转移。

(整个算法实际上是对每个\(a_i\)的二进制表示枚举了它的子集,而\(a_i\)互不相同,相当于是对所有二进制子集枚举了它的子集,所以复杂度是\(3^{\log a_{max}}=3^{18}\))

这样好像比较危险?(出二进制\(1\)很多的\(a_i\))


(以上都不是重点)

我们将这两种方式综合一下:

转移时,固定\(i\)的后\(9\)位,枚举\(i\)前\(9\)位的子集\(j\),用\(f[i]\)更新后面的\(f[j]\);

求值时,固定\(i\)的前\(9\)位,枚举\(i\)后\(9\)位的超集\(j\),从前面的\(f[j]\)转移,即\(f[i]=\sum f[j]\)。

这样复杂度是啥啊。。我不知道,反正靠谱很多。

dls现场分析:大概是从之前的\(2^{\log_23\cdot n}=2^{1.59n}\)优化到了\(2^{1.5n}\)。

考虑枚举不满,大概有\(2^{(0.6+\frac{1.59}{2})n}=2^{1.3n+}\)?


顺便记下枚举子集复杂度\(O(3^n)\)的证明:

证明:设集合有\(n\)个元素,我们把所有子集\(s\)按元素个数\(k=|s|\)分类(因为它们的子集都为\(2^k\)个。那么枚举的集合数为:$$\sum_{k=0}nC_{n}k2k=(1+2)n=3^n$$

代码就是这样:

for(s=0; s<all; ++s)
for(i=s; i; i=(i-1)&s)
...

以前的题解(naive啊):https://www.cnblogs.com/SovietPower/p/8776368.html。


//3800kb	688ms
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 2000000
#define mod 1000000007
#define Mod(x) x>=mod&&(x-=mod)
typedef long long LL;
const int N=(1<<18)+3,L=(1<<9)-1; struct io
{
char IN[MAXIN],*s;
io():s(IN) {IN[fread(IN,1,MAXIN,stdin)]=0;}
inline operator int()
{
int x=0;
for(; *s<48; ++s);
for(; *s>47; x=x*10+*s++-48);
return x;
}
}io; int main()
{
static int f[N];
int n=io; LL ans=0,sum;
for(int i=1,a; i<=n; ++i)
{
a=io,sum=0;
int l=a&L, r=a>>9;
for(int j=r; j<=L; j=(j+1)|r)
sum+=f[(j<<9)|l];
ans+=sum%=mod, ++sum;
r<<=9;
for(int j=l; j; j=(j-1)&l)
f[j|r]+=sum, Mod(f[j|r]);
f[r]+=sum, Mod(f[r]);//0|r
}
printf("%lld\n",ans%mod); return 0;
}

BZOJ.4903.[CTSC2017]吉夫特(Lucas DP)的更多相关文章

  1. BZOJ 4903: [Ctsc2017]吉夫特 数论+dp

    思路很巧妙的一道题 ~ 这个应该不完全是正解,复杂度约为 $O(3\times 10^8)$,有时间再研究研究正解. 首先,最裸的暴力是按照权值从小到大枚举每一个数,然后枚举后面的数来更新方案数,是 ...

  2. bzoj 4903: [Ctsc2017]吉夫特【lucas+状压dp】

    首先根据lucas, \[ C_n^m\%2=C_{n\%2}^{m\%2}*C_{n/2}^{m/2} \] 让这个式子的结果为计数的情况只有n&m==m,因为m的每一个为1的二进制位都需要 ...

  3. [CTSC2017]吉夫特(Lucas定理,DP)

    送70分,预处理组合数是否为偶数即可. 剩下的数据,根据Lucas定理的推论可得当且仅当n&m=n的时候,C(n,m)为奇数.这样就可以直接DP了,对于每个数,考虑它对后面的数的影响即可,直接 ...

  4. 洛谷P3773 [CTSC2017]吉夫特(Lucas定理,dp)

    题意 满足$b_1 < b_2 < \dots < b_k$且$a_{b_1} \geqslant a_{b_2} \geqslant \dots \geqslant a_{b_k} ...

  5. bzoj4903 & loj2264 [Ctsc2017]吉夫特 Lucas 定理+状压DP

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4903 https://loj.ac/problem/2264 http://uoj.ac/pr ...

  6. uoj 300 [CTSC2017]吉夫特 - Lucas - 分块 - 动态规划

    题目传送门 戳此处转移 题目大意 给定一个长为$n$的序列,问它有多少个长度大于等于2的子序列$b_{1}, b_{2}, \cdots, b_{k}$满足$\prod_{i = 2}^{k}C_{b ...

  7. BZOJ4903 UOJ300 CTSC2017 吉夫特 【Lucas定理】

    BZOJ4903 UOJ300 CTSC2017 吉夫特 弱弱地放上题目链接 Lucas定理可以推一推,发现C(n,m)是奇数的条件是n" role="presentation&q ...

  8. [BZOJ 4033] [HAOI2015] T1 【树形DP】

    题目链接:BZOJ - 4033 题目分析 使用树形DP,用 f[i][j] 表示在以 i 为根的子树,有 j 个黑点的最大权值. 这个权值指的是,这个子树内部的点对间距离的贡献,以及 i 和 Fat ...

  9. Bzoj 1055: [HAOI2008]玩具取名 (区间DP)

    Bzoj 1055: [HAOI2008]玩具取名 (区间DP) 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1055 区间动态规划和可 ...

随机推荐

  1. k64 datasheet学习笔记3---Chip Configuration之System modules

    1.前言 本文主要介绍芯片配置的系统模块的内容 2.SIM配置 TODO 3.SMC配置 TODO 4.PMC配置 TODO 5.LOW-LEAKAGE WAKEUP单元配置 TODO 6.MCM配置 ...

  2. dump_stack的简单使用 【转】

    转自:http://blog.chinaunix.net/uid-26403844-id-3361770.html http://blog.csdn.net/ryfjx6/article/detail ...

  3. Hacker学习发展流程图

    题记:梅花香自苦寒来.转载请注明版权:http://a1pass.blog.163.com/      A1Pass      今天看一位网友的日志上面有一篇名为“学黑的目标”的日志,里面有一个略显粗 ...

  4. Ubuntu/Debian apt-get 404 Not Found Package Repository Errors,无法找到包的错误

    最简单最常用的方法是,使用如下命令更新到新的版本: sudo apt-get dist-upgrade 但是这个方法有时候不一定能起作用,那么可以使用以下直接替换的命令: sudo sed -i -e ...

  5. mac安装mysql8.0的错误

    在MySQL 8.0中,caching_sha2_password是默认的身份验证插件,而不是mysql_native_password.有关此更改对服务器操作的影响以及服务器与客户端和连接器的兼容性 ...

  6. ThinkPHP使用不当可能造成敏感信息泄露

    ThinkPHP在开启DEBUG的情况下会在Runtime目录下生成日志,如果debug模式不关,可直接输入路径造成目录遍历. ThinkPHP3.2结构:Application\Runtime\Lo ...

  7. PYTHON-有参装饰器,无参装饰器,语法糖

    装饰器 装饰器就是闭包函数的一种应用场景 一 为何要用装饰器 #开放封闭原则:对修改封闭,对扩展开放 二 什么是装饰器 装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象. 强 ...

  8. javascript NaN注意事项

    NaN直译是Not a number NaN是个特殊的number,它和任何值相比都不相等,甚至和它自己. NaN === NaN 这个表达式是false 唯一能判断NaN的方法是 IsNaN(NaN ...

  9. css之absolute

    一.absolute和float有相同的特性,包裹性和破坏性 1.absolute和float的相似(看下面的demo,如果图片在左上角,那么用float和absolute都一样) <!doct ...

  10. SpringMVC(1):Web MVC简介

    原文出处: 张开涛 Web MVC简介 1.1.Web开发中的请求-响应模型: 在Web世界里,具体步骤如下: 1.  Web浏览器(如IE)发起请求,如访问 2.  Web服务器(如Tomcat)接 ...