uoj 300 [CTSC2017]吉夫特 - Lucas - 分块 - 动态规划
2024-08-25 20:24:56
题目传送门
戳此处转移
题目大意
给定一个长为$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 ;
}
最新文章
- 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类
- hiho #1372:平方求 (bfs)
- Spring和Hibernate集成配置
- The index also can be used for LIKE comparisons if the argument to LIKE is a constant string that does not start with a wildcard character.
- yii2的redis扩展使用
- JS类库函数收集中....
- 中断——中断处理程序的进入与退出 (基于3.16-rc4)
- 你知道C/S和B/S两种架构有什么区别吗?
- P2P风险淮安样本:5000万连锁漩涡牵出银行内案
- Android多媒体开发-- android中OpenMax的实现整体框架
- linux下socket编程-UDP
- 关于python编译的一点小结
- SpringCloud学习笔记(3)——Hystrix
- select case when与IF的用法
- 对Vuex的初步了解
- Java中如何拆分字符串为字符数组
- setTimeout.js
- MVC开发中的常见错误-05-无法将类型“System.Data.Entity.Infrastructure.DbQuery<;BBFJ.OA.Model.RoleInfo>;”转换为“System.Collections.Generic.List<;BBFJ.OA.Model.RoleInfo>;”
- mongodb自动关闭:页面文件太小,无法完成操作
- python的错误类型和异常处理