uoj 300 [CTSC2017]吉夫特 - Lucas - 分块 - 动态规划
题目传送门
戳此处转移
题目大意
给定一个长为$n$的序列,问它有多少个长度大于等于2的子序列$b_{1}, b_{2}, \cdots, b_{k}$满足$\prod_{i = 2}^{k}C_{b_{i - 1}}^{b_{i}} \equiv 1 \pmod{2}$。答案模$10^{9} + 7$
考虑限制条件,即前后两个数$b_{i - 1}, b_{i}$,它们要满足$C_{b_{i - 1}}^{b_{i}} \equiv 1\pmod{2}$。
这样不好处理,考虑使用Lucas定理,得到$b_{i - 1}$是$b_{i}$的子集的结论。
然后是个常规动态规划,用$f[i][s]$表示考虑到第$i$位,最后一个数是$s$的方案数。但是这样时间复杂度$O(n^{2})$。
考虑分块,每个位置将它的子集信息上传。
然后修改和查询一个枚举前9位,一个枚举后9位就行了。
一直不知道所有数互不相同的意义。
然后直到今天,发现可以直接枚举子集,$O(3^{\left \lceil \log_{2}W \right \rceil})$。
Code
/**
* uoj
* Problem#300
* Accepted
* Time: 400ms
* Memory: 2956k
*/
#include <bits/stdc++.h>
using namespace std;
typedef bool boolean; const int S = << , M = 1e9 + ;
const int maskL = ( << ) - , maskH = maskL << , mask = maskL | maskH; int n;
int *ar;
int f[S][S]; inline void init() {
scanf("%d", &n);
ar = new int[(n + )];
for (int i = ; i <= n; i++)
scanf("%d", ar + i);
} inline int query(int S) {
int rt = , s0 = S & maskL, s1 = (S & maskH) >> , ms1 = s1 ^ maskL;
for (int s = ms1; s; s = (s - ) & ms1)
rt = (rt + f[s | s1][s0]) % M;
return (rt + f[s1][s0]) % M;
} inline void modify(int S, int val) {
int s0 = S & maskL, s1 = (S & maskH) >> ;
for (int s = s0; s; s = (s - ) & s0)
f[s1][s] = (f[s1][s] + val) % M;
f[s1][] = (f[s1][] + val) % M;
} int res = ; inline void solve() {
modify(mask, );
for (int i = , c; i <= n; i++) {
c = query(ar[i]);
res = (res + c) % M;
modify(ar[i], c);
}
res = (res - n + M) % M;
printf("%d", res);
} int main() {
// freopen("gift.in", "r", stdin);
init();
solve();
return ;
}
uoj 300 [CTSC2017]吉夫特 - Lucas - 分块 - 动态规划的更多相关文章
- 【BZOJ4903】【UOJ#300】吉夫特(卢卡斯定理,动态规划)
[BZOJ4903][UOJ#300]吉夫特(卢卡斯定理,动态规划) 题面 UOJ BZOJ:给的UOJ的链接...... 题解 首先模的质数更小了,直接给定了\(2\).当然是卢卡斯定理了啊. 考虑 ...
- loj 300 [CTSC2017]吉夫特 【Lucas定理 + 子集dp】
题目链接 loj300 题解 orz litble 膜完题解后,突然有一个简单的想法: 考虑到\(2\)是质数,考虑Lucas定理: \[{n \choose m} = \prod_{i = 1} { ...
- bzoj4903 & loj2264 [Ctsc2017]吉夫特 Lucas 定理+状压DP
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4903 https://loj.ac/problem/2264 http://uoj.ac/pr ...
- BZOJ.4903.[CTSC2017]吉夫特(Lucas DP)
题目链接 首先\(C(n,m)\)为奇数当且仅当\(n\&m=m\). 简要证明: 因为是\(mod\ 2\),考虑Lucas定理. 在\(mod\ 2\)的情况下\(C(n,m)\)最后只会 ...
- [CTSC2017]吉夫特(Lucas定理,DP)
送70分,预处理组合数是否为偶数即可. 剩下的数据,根据Lucas定理的推论可得当且仅当n&m=n的时候,C(n,m)为奇数.这样就可以直接DP了,对于每个数,考虑它对后面的数的影响即可,直接 ...
- 洛谷P3773 [CTSC2017]吉夫特(Lucas定理,dp)
题意 满足$b_1 < b_2 < \dots < b_k$且$a_{b_1} \geqslant a_{b_2} \geqslant \dots \geqslant a_{b_k} ...
- BZOJ4903 UOJ300 CTSC2017 吉夫特 【Lucas定理】
BZOJ4903 UOJ300 CTSC2017 吉夫特 弱弱地放上题目链接 Lucas定理可以推一推,发现C(n,m)是奇数的条件是n" role="presentation&q ...
- [UOJ300][CTSC2017]吉夫特
uoj bzoj luogu sol 根据\(Lucas\)定理,\(\binom nm \mod 2=\binom{n\%2}{m\%2}\times\binom{n/2}{m/2}\mod 2\) ...
- uoj#300.【CTSC2017】吉夫特
题面:http://uoj.ac/problem/300 一道大水题,然而我并不知道$lucas$定理的推论.. $\binom{n}{m}$为奇数的充要条件是$n&m=n$.那么我们对于每个 ...
随机推荐
- (已解决)cocos2d-x 运行时xcode提示错误:"vtable for XXX", referenced from;
vtable/引用和虚函数相关,今天在添加一个层的时候报了这个错误,很低级的错误,忘了实现虚函数了(谨记!!) 若如果实现了虚函数还依然如此的话,可能是创建的时候忘了钩上 -desktop 选项了,把 ...
- pyqt常用窗口组件
扩展知识: 熟悉常用的窗口组件: 1 按钮类 QPushButton 普通按钮 QToolButton 工具按钮:通常在工具栏使用 QRadioButton 单选框 QCheckBox ...
- 那种多空计算方法更正确呢?——从此图看应该是TEST005
那种方法计算多空逆转更正确呢?——从此图1看应该是TEST005,但是实际上是ZCL_多空! TEST005具有滞后性!也就是说跌了一些在报警,可能已经跌了10%(如图2) ZCL_多空:当计算结果和 ...
- MyBatis基础入门《十三》批量新增数据
MyBatis基础入门<十三>批量新增数据 批量新增数据方式1:(数据小于一万) xml文件 接口: 测试方法: 测试结果: =============================== ...
- 纯HTML和CSS实现点击切换
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- jquery $.ajax $.get $.post的区别?
$.ajax 是 jQuery 底层 AJAX 实现,$.ajax是一种通用的底层封装,$.ajax()请求数据之后,则需要使用回调函数,有beforeSend.error.dataFilter.su ...
- Unity shader学习之屏幕后期效果之调整屏幕亮度,饱和度,对比度
Unity的屏幕后期处理效果,使用MonoBehaviour.OnRenderImage来实现. 转载请注明出处:http://www.cnblogs.com/jietian331/p/7228063 ...
- django 静态css js文件配置
参考:http://blog.csdn.net/liqiancao/article/details/66151287
- Web API 跨域请求
分布式技术在项目中会频繁用到,以前接触过WebService(可跨平台).WCF(功能强大,配置繁琐), 最近由于上层业务调整,将原来的MVC项目一分为三,将数据层提取出来,用API去访问.然后 ...
- maven的profile详解
详细内容请见:https://www.cnblogs.com/wxgblogs/p/6696229.html Profile能让你为一个特殊的环境自定义一个特殊的构建:profile使得不同环境间构建 ...