题目传送门

  戳此处转移

题目大意

  给定一个长为$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 ;
}

最新文章

  1. 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类
  2. hiho #1372:平方求 (bfs)
  3. Spring和Hibernate集成配置
  4. 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.
  5. yii2的redis扩展使用
  6. JS类库函数收集中....
  7. 中断——中断处理程序的进入与退出 (基于3.16-rc4)
  8. 你知道C/S和B/S两种架构有什么区别吗?
  9. P2P风险淮安样本:5000万连锁漩涡牵出银行内案
  10. Android多媒体开发-- android中OpenMax的实现整体框架
  11. linux下socket编程-UDP
  12. 关于python编译的一点小结
  13. SpringCloud学习笔记(3)——Hystrix
  14. select case when与IF的用法
  15. 对Vuex的初步了解
  16. Java中如何拆分字符串为字符数组
  17. setTimeout.js
  18. MVC开发中的常见错误-05-无法将类型“System.Data.Entity.Infrastructure.DbQuery&lt;BBFJ.OA.Model.RoleInfo&gt;”转换为“System.Collections.Generic.List&lt;BBFJ.OA.Model.RoleInfo&gt;”
  19. mongodb自动关闭:页面文件太小,无法完成操作
  20. python的错误类型和异常处理

热门文章

  1. Oracle如何查询当前的crs/has自启动状态
  2. C#什么时候需要使用构造函数
  3. 源码解读 Laravel PHP artisan config:cache
  4. Spring MVC / Boot
  5. lua学习之循环求一个数的阶乘
  6. git分支流
  7. 即时通讯(I)
  8. Win7 Python开发环境搭建
  9. python 内置函数 sorted()
  10. Firefox 功能笔记