题面

链接

简单的题目,既是礼物,也是毒药。

B 君设计了一道简单的题目,准备作为 gift 送给大家。

输入一个长度为 n n n 的数列 a 1 , a 2 , ⋯ , a n a_1, a_2, \cdots , a_n a1​,a2​,⋯,an​ 问有多少个长度大于等于 2 2 2 的不上升的子序列满足:
∏ i = 2 k ( a b i − 1 a b i ) m o d 2 = ( a b 1 a b 2 ) × ( a b 2 a b 3 ) × ⋯ ( a b k − 1 a b k ) m o d 2 > 0 \prod_{i=2}^{k}\begin{pmatrix}a_{b_{i-1}}\\a_{b_i}\end{pmatrix}\mod 2=\begin{pmatrix}a_{b_{1}}\\a_{b_2}\end{pmatrix}×\begin{pmatrix}a_{b_{2}}\\a_{b_3}\end{pmatrix}×\cdots\begin{pmatrix}a_{b_{k-1}}\\a_{b_k}\end{pmatrix}\mod 2>0 i=2∏k​(abi−1​​abi​​​)mod2=(ab1​​ab2​​​)×(ab2​​ab3​​​)×⋯(abk−1​​abk​​​)mod2>0
输出这个个数对 1000000007 1000000007 1000000007 取模的结果。

……

G 君听说这个题是作为 gift 送给大家,她有一句忠告。

“Vorsicht, Poison!”

“小心. . . . . .礼物! ”

输入格式

第一行一个整数 n n n。

接下来 n n n 行,每行一个整数,这 n n n 行中的第 i i i 行,表示 a i a_i ai​ 。

输出格式

一行一个整数表示答案。

数据范围

1 ≤ n ≤ 211985 1\leq n\leq 211985 1≤n≤211985, 1 ≤ a i ≤ 233333 1\leq a_i\leq 233333 1≤ai​≤233333 (不超过 2 18 2^{18} 218)。
所有的 a i a_i ai​ 互不相同,也就是说不存在 i , j i, j i,j 同时满足 1 ≤ i < j ≤ n 1\leq i < j\leq n 1≤i<j≤n 和 a i = a j a_i = a_j ai​=aj​ 。

题解

相信大家和我一样,看到这道题就从 ⁣ ⁣ ⁣ m o d 2 > 0 \!\!\!\mod 2>0 mod2>0 开始推起,转换成结果为奇数,然后中间每个组合数都得是奇数,然后再把组合数拆开看怎么达到奇数……

其实转化为每个 C ( a b i − 1 , a b i ) m o d 2 > 0 C(a_{b_{i-1}},a_{b_i})\mod 2>0 C(abi−1​​,abi​​)mod2>0 就足够了,本来我们看到模数这么小应该先想到Lucas定理的。

用Lucas定理化简一下 C ( A , B ) m o d 2 C(A,B)\mod 2 C(A,B)mod2 ,得到
C ( A & 2 0 , B & 2 0 ) ∗ C ( A & 2 1 , B & 2 1 ) ∗ C ( A & 2 2 , B & 2 2 ) ∗ ⋯ m o d 2 C(A\&2^0,B\&2^0)*C(A\&2^1,B\&2^1)* C(A\&2^2,B\&2^2)*\cdots\mod 2 C(A&20,B&20)∗C(A&21,B&21)∗C(A&22,B&22)∗⋯mod2因此,上式中每一个组合数都得是 1 1 1 ,结果才能是 1 1 1 。

根据上式,只会出现 C ( 1 , 1 ) , C ( 1 , 0 ) , C ( 0 , 0 ) , C ( 0 , 1 ) C(1,1),C(1,0),C(0,0),C(0,1) C(1,1),C(1,0),C(0,0),C(0,1) 这四种组合数,而只有 C ( 0 , 1 ) C(0,1) C(0,1) 不是 1 1 1 而是 0 0 0 ,所以不能出现 C ( 0 , 1 ) C(0,1) C(0,1) ,这就要求 B & A = B ( B ⊆ A ) B\;\&\;A=B\;\;(B\subseteq A) B&A=B(B⊆A)。

那么题意成功转化:找出长度大于等于 2 2 2下降子序列 a 1 , a 2 , ⋯ , a n a_1, a_2, \cdots , a_n a1​,a2​,⋯,an​ 满足二进制下后一个数是前一个数的子集。

这个其实用一个状压DP就很好做了,每一个数不同,因此可以每一种数字对应一个位置,转移时保证更大的数字位置更靠前(谨记),至于长度大于等于 2 2 2,倒没必要在边界上费心,只需要最后减去长度小于 2 2 2 的就行。

CODE

(认真整了点没用的优化)

#include<ctime>
#include<cmath>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define LL long long
#define MAXN 211990
#define MAXM (1<<18|5)
#define DB double
#define ENDL putchar('\n')
#define INF ((LL)1e18)
#define lowbit(x) (-(x) & (x))
LL read() {LL f=1,x=0;char s = getchar();while(s < '0' || s > '9') {if(s=='-')f = -f;s = getchar();}while(s >= '0' && s <= '9') {x=x*10+(s-'0');s = getchar();}return f * x;
}
const int MOD = 1000000007;
int n,m,s,i,j,o,k;
int a[MAXN];
int pt[MAXM],ct[MAXM];
int dp1[MAXM],dp2[MAXM],dp[MAXM];
int main() {n = read();m = 1;int CT = 0;for(int i = 1;i <= n;i ++) {a[i] = read();pt[a[i]] = i;while(m-1 <= a[i]) m <<= 1,CT ++;}
//  printf("m:%d\n",m);pt[0] = n+1;for(int i = 1;i < m;i ++) ct[i] = ct[i-lowbit(i)] + 1;dp1[m-1] = 1;for(int i = m-2;i > 0;i --) {if(ct[i]*2 >= CT && pt[i]) {dp1[i] = 0;int ni = (m-1) ^ i;for(int j = ni;j > 0;j = (j-1)&ni) {if(pt[i^j] < pt[i]) (dp1[i] += dp1[i^j]) %= MOD;}
//          printf("dp1[%d] = %d\n",i,dp1[i]);}}dp2[0] = 1;for(int i = 1;i < m-1;i ++) {if(ct[i]*2 < CT && pt[i]) {dp2[i] = 0;for(int j = i;j > 0;j = (j-1)&i) {if(pt[i^j] > pt[i]) (dp2[i] += dp2[i^j]) %= MOD;}
//          printf("dp2[%d] = %d\n",i,dp2[i]);}}int ans = 0;for(int i = 1;i < m;i ++) {if(i == m-1 || (ct[i]*2 >= CT && pt[i])) {for(int j = i;j > 0;j = (j-1)&i) {if((ct[i^j]<<1) < CT && pt[i^j] > pt[i])(dp[i] += dp1[i] *1ll* dp2[i^j] % MOD) %= MOD;}}(ans += dp[i]) %= MOD;}(ans += MOD-(n+1)) %= MOD;printf("%d\n",ans);return 0;
}

「CTSC2017」吉夫特(Gift) (Lucas定理,状压DP)相关推荐

  1. 【Codeforces】Gym 101173B Bipartite Blanket 霍尔定理+状压DP

    题意 给一张$n\times m$二分图,带点权,问有多少完美匹配子集满足权值和大于等于$t$ 这里有一个结论:对于二分图$\mathbb{A}$和$\mathbb{B}$集合,如果子集$A \in ...

  2. LibreOJ #6177. 「美团 CodeM 初赛 Round B」送外卖2【状压DP】

    「美团 CodeM 初赛 Round B」送外卖2 内存限制:32 MiB 时间限制:200 ms 题目描述 一 张 n 个 点 m 条 有 向 边 的 图 上 , 有 q 个 配 送 需 求 , 需 ...

  3. loj 300 [CTSC2017]吉夫特 【Lucas定理 + 子集dp】

    题目链接 loj300 题解 orz litble 膜完题解后,突然有一个简单的想法: 考虑到\(2\)是质数,考虑Lucas定理: \[{n \choose m} = \prod_{i = 1} { ...

  4. BZOJ.4160.[NEERC2009]Exclusive Access 2(状压DP Dilworth定理)

    BZOJ DAG中,根据\(Dilworth\)定理,有 \(最长反链=最小链覆盖\),也有 \(最长链=最小反链划分数-1\)(这个是指最短的最长链?并不是很确定=-=),即把所有点划分成最少的集合 ...

  5. 「hdu6608」Fansblog【Miller_Rabin+威尔逊定理】

    Fansblog Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Subm ...

  6. loj#2542. 「PKUWC2018」随机游走(MinMax容斥 期望dp)

    题意 题目链接 Sol 考虑直接对询问的集合做MinMax容斥 设\(f[i][sta]\)表示从\(i\)到集合\(sta\)中任意一点的最小期望步数 按照树上高斯消元的套路,我们可以把转移写成\( ...

  7. 不同范数下的余弦定理_第06题 | 从源头追溯「余弦定理」amp; 文理科知识点的异同...

    文.理科数学大部分知识点.甚至相关知识点的考查形式都是共同的,甚至往年理科题目过几年就会出现在文科试卷上,反之亦然:「射影定理」是「余弦定理」的直接来源,所以不算超纲知识点. 先发福利:这里有6场「高 ...

  8. 性能测试时那些「难以启齿」的问题-CPU相关

    NO.1 为什么cpu使用率可以>100%? 小白的我在进行压测的时候,查看服务的cpu总使用率如下,总使用率会超过100%,这个数据是怎么来的呢,为什么会有大于100%的情况呢? 作为小白的我 ...

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

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

最新文章

  1. python打包成exe可执行文件指定进程名字
  2. java qq协议 c#,C# WebQQ协议群发机器人(三)
  3. linux下的包和RPM管理
  4. Gartner:2012年大数据HypeCycle
  5. [原]动态创建Web控件制做计算器
  6. 分别是什么意思_你知道抗震支架T和TL分别代表什么意思?
  7. android .a .so区别,.so,.la和.a库文件有什么区别?
  8. [Google Guava] 3-缓存
  9. php json存mysql斜杠_MySQL 存储php中json_encode格式中文问题及解决
  10. Android Touch系统简介(二):实例详解onInterceptTouchEvent与onT
  11. Python Mixin技术介绍
  12. 查看环境列表_Xfce 4.14桌面环境正式发布,想要图形界面又想节省内存?就它了...
  13. java实现鸭子类型,Golang的interface及duck typing鸭子类型
  14. CSS3制作3D水晶糖果按钮
  15. 知识点026-rsync命令的使用
  16. async与defer
  17. c#开发Mongo笔记第九篇
  18. deepin 相关
  19. 基于JAVA乐居租房网的设计与实现计算机毕业设计源码+系统+lw文档+部署
  20. 软件人员kpi制定模板_KPI绩效考核软件有哪些?拥有多种考核模板i人事

热门文章

  1. 人工智能数学基础-线性代数4:矩阵及矩阵运算
  2. 张飞硬件班笔记之电容
  3. 调查显示,年轻人才仍最看重“未来高收入”,“找到安全的就业”重要性急剧上升|美通社头条...
  4. Spring Boot笔记(七) springboot 集成 JavaMail 实现邮箱认证
  5. ceph rbd mysql_ceph-rbd 常用命令
  6. 软件测试基础(七)测试规范的确定
  7. Presto读Hive报错: Malformed ORC file. Cannot read SQL type ‘tinyint‘ from ORC stream...
  8. Windows 10系统自带Virtual Private Network客户端配置连接L2TP服务器_2
  9. 计算机毕业设计Javaweb企业档案管理系统(源码+系统+mysql数据库+lw文档)
  10. Ubuntu:E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?