Description

  

  传送门

  

​  简述题意:给一个序列,询问有多少子序列满足其中不会出现\(a\choose b\)是偶数的情况,其中\(a\)在\(b\)前面。

  

  

  

Solution

  

  首先探究组合数的奇偶性问题。我们用Lucas定理展开组合数,可以发现一些有趣的性质:

\[{a\choose b}={\lfloor\frac a 2 \rfloor\choose \lfloor \frac b2\rfloor}{a\mod2 \choose b\mod 2}
\]

  后一个括号的值可以直接算:\({0\choose 0}={1\choose 0}={1\choose 1}=1,\;\;{0\choose 1}=0\)。这相当于\(a\)和\(b\)的二进制最末位的某种计算。

  

  而想象一下第一个括号递归计算的过程,实际上是移除了\(a\)和\(b\)的二进制最后一位继续计算。到底层时,其值必定是1。

  

  所以决定总体奇偶的地方在于第二个括号会不会取0。也就是会不会出现\(a\)末位为0,\(b\)末位为1的情况。

  

  这整一个过程的实质是什么?相当于比较\(a\)和\(b\)的每一位对应二进制。一旦出现\(a\)某一位为0,\(b\)对应位为1,则整体为偶数。否则整体为奇数。

  

  再进一步考虑,这种条件,相当于判断\(b\)的1位集合是否是\(a\)的1位集合的子集,则整体奇数,否则整体偶数。

  

  有趣的是,这种关系具有传递性:如果\(a\)包含\(b\),那么\(a\)包含以\(b\)开头的合法子序列的每个元素。问题变得非常简单,只需要考虑从哪一个子序列的开头转移:设\(f[a]\)表示以\(a\)为开头的子序列个数。枚举\(a\)的子集\(b\),如果\(b\)在\(a\)后面,则\(f[a]+=f[b]\)。

  

  总时间复杂度为\(\mathcal O(3^{\log_2n})\)。

  

    

  

Code

  

#include <cstdio>
#include <algorithm>
using namespace std;
const int N=211990,S=233335,MOD=1e9+7;
int n,a[N],p[S],f[S];
inline int plu(int x,int y){return (x+y)%MOD;}
inline void upd(int &x,int y){x=plu(x,y);}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",a+i);
int ans=-n;
for(int i=n;i>=1;i--){
f[a[i]]=1;
for(int j=(a[i]-1)&a[i];j;j=(j-1)&a[i])
upd(f[a[i]],f[j]);
upd(ans,f[a[i]]);
}
printf("%d\n",plu(ans,MOD));
return 0;
}

【BZOJ4903/UOJ300】【CTSC2017】吉夫特的更多相关文章

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

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

  2. [UOJ300][CTSC2017]吉夫特

    uoj bzoj luogu sol 根据\(Lucas\)定理,\(\binom nm \mod 2=\binom{n\%2}{m\%2}\times\binom{n/2}{m/2}\mod 2\) ...

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

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

  4. 【bzoj4903/uoj300】[CTSC2017]吉夫特 数论+状压dp

    题目描述 给出一个长度为 $n$ 的序列,求所有长度大于等于2的子序列个数,满足:对于子序列中任意两个相邻的数 $a$ 和 $b$ ($a$ 在 $b$ 前面),${a\choose b}\mod 2 ...

  5. bzoj千题计划247:bzoj4903: [Ctsc2017]吉夫特

    http://uoj.ac/problem/300 预备知识: C(n,m)是奇数的充要条件是 n&m==m 由卢卡斯定理可以推出 选出的任意相邻两个数a,b 的组合数计算C(a,b)必须是奇 ...

  6. BZOJ4903: [Ctsc2017]吉夫特

    传送门 可以发现,\(\binom{n}{m}\equiv 1(mod~2)\) 当且仅当 \(m~and~n~=~m\) 即 \(m\) 二进制下为 \(n\) 的子集 那么可以直接写一个 \(3^ ...

  7. [CTSC2017]吉夫特

    Description: 给定一个序列\(a_1,a_2,a_3...a_n\) 求有多少个不上升子序列: \(a_{b1},a_{b_2}...\) 满足 \(C_{a_{b1}}^{a_{b2}} ...

  8. BZOJ.4903.[CTSC2017]吉夫特(Lucas DP)

    题目链接 首先\(C(n,m)\)为奇数当且仅当\(n\&m=m\). 简要证明: 因为是\(mod\ 2\),考虑Lucas定理. 在\(mod\ 2\)的情况下\(C(n,m)\)最后只会 ...

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

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

随机推荐

  1. 《杜增强讲Unity之Tanks坦克大战》6-发射子弹

    6 发射子弹 本节完成发射子弹的功能,最终代码如下:   image 首先,发射子弹得确定发射的位置和方向,还有发射的初始速度.具体的发射速度和按下发射按键的时间长短有关,这个关于子弹的蓄力我们在第九 ...

  2. hadoop最新稳定版本使用建议

    Apache Hadoop Apache版本衍化比较快,我给大家介绍一下过程 ApacheHadoop版本分为两代,我们将第一代Hadoop称为Hadoop 1.0,第二代Hadoop称为Hadoop ...

  3. Spring入门学习笔记(1)

    目录 Spring好处 依赖注入 面向面编程(AOP) Spring Framework Core Container Web Miscellaneous 编写第一个程序 IoC容器 Spring B ...

  4. 苏宁笔试:UML类图中的关系

    1. 依赖 2. 关联 3. 聚合 4. 组合 5. 泛化 6. 实现

  5. 20162328蔡文琛 week05 大二

    20162328 2017-2018-1 <程序设计与数据结构>第5周学习总结 教材学习内容总结 集合是收集元素并组织其他对象的对象. 集合中的元素一般由加入集合的次序或元素之间的某些固有 ...

  6. servlet几个常用的方法

    servlet继承了HTTPServlet所以可以重写父类的方法,下面一 一介绍方法Dopost DoGet 比较常用不再介绍. 一.Init(),和Init(ServletConfig config ...

  7. Hibernate笔记②--hibernate类生成表、id生成策略、级联设置、继承映射

    一.多表的一个关联关系 老师和学生是一对多的关系 student:tid属性 外键约束 对应teacher表中的id属性 teacher:id 在myeclipse的db窗口中选中两个表来生成类.   ...

  8. 软工1816 · Beta冲刺(1/7)

    团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 完成beta冲刺阶段的任务安排 整理博客 接下来的计划 & 还剩下哪些 ...

  9. 面向对象程序设计第三次作业-Calculator

    题目: 最终代码: Scan.h: Print.h: Calaulator.cpp: 解题过程 看到题目后,在查询之后明白了这是多文件的题目,然后通过翁凯老师的视频讲解知道了.h和.cpp文件的区别和 ...

  10. Maya学习笔记

    软件: Maya 2016 : 参考教材: Maya 2016 中文版标准教程 ; 改变视图颜色 [窗口]|[设置/首项选择]|[颜色设置]|[3D视图]: 观察视图 旋转视图 Alt + 鼠标左键 ...