博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P3773 [CTSC2017]吉夫特(Lucas定理,dp)
阅读量:5996 次
发布时间:2019-06-20

本文共 841 字,大约阅读时间需要 2 分钟。

题意

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

 

Sol

组合数取模?

肯定考虑Lucas定理

考虑Lucas定理在最后一步肯定会化为$C(1, 1), C(1, 0), C(0, 0), C(0, 1)$。

很显然$C(0,1)$不存在,而其他的都等于$1$,因此当最后分解为$C(0, 1)$的时候不满足条件。

具体怎么判断呢?观察上式可以得到一个普遍的规律:若$C(x, y) \{x = 0, 1 \ y=0,1 \}$,则$x\&y = y$

根据Lucas定理,显然我们可以把这个公式推广开来。

若$C(n,m)$为奇数,则$n \& m = m$

有了这个定理,我们就可以dp了。直接枚举子集就好。

时间复杂度:

枚举子集的复杂度是$O(3^n)$的,在此题中我们需要枚举二进制位,

因此复杂度为$3^{max log233333}$

#include
#define LL long long using namespace std;const int mod = 1000000007;LL f[233334], N, ans = 0;int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> N; for(int i = 1; i <= N; i++) { int x; cin >> x; for(int j = x; j <= 233333; j = j + 1 | x) (f[x] += f[j]) %= mod; (ans += f[x]) %= mod; f[x]++; } cout << ans; return 0;}

 

转载地址:http://jjqlx.baihongyu.com/

你可能感兴趣的文章
ucgui界面设计演示样例2
查看>>
蓝桥杯练习系统——基础练习 十六进制转十进制
查看>>
ionic3+angular4+cordova 项目实例
查看>>
(转)设计模式——观察者模式
查看>>
Jar包冲突解决方法
查看>>
彻底搞清楚Java并发 (一) 基础
查看>>
SQL疑难杂症【3】链接服务器提示"无法启动分布式事物"
查看>>
Windows Mobile和Wince(Windows Embedded CE)下如何封装Native DLL提供给.NET Compact Framework进行调用...
查看>>
数据库相关
查看>>
HDU Count the string (KMP)
查看>>
C#中的泛型
查看>>
编程之美4:求数组中的最大值和最小值
查看>>
ios7新增基础类库以及OC新特性
查看>>
[LeetCode] Maximal Square
查看>>
代码设置TSQLCONNECTION参数
查看>>
步步为营 .NET 代码重构学习笔记系列总结
查看>>
BROKER服务器同客户端和应用服务器三者之间传递消息的格式定义
查看>>
【转】20个Cydia常见错误问题解决方法汇总
查看>>
使用jQuery和Bootstrap实现多层、自适应模态窗口
查看>>
C#中如何选择使用T[]或List<T>
查看>>