题目大意

给定一个长度为 \(N\)​ 的非负整数序列 \(A_1,A_2, \ldots ,A_N\)​,和一个正整数 \(M\)​。序列 \(A\) ​满足 \(\forall 1 \le i \le N, A_i \in [0, 2^M)\)​。定义一个长度为 \(N\) ​的非负整数序列 \(B\) ​是合法的,当且仅当其满足如下三个条件:

(1)\(\forall 1 \le i \le N\)​, \(B_i \in [0,2^M)\)​;

(2)\(\forall 1\le i< N,(A_i\ \text{and}\ B_i )\ \le (A_{i+1}\ \text{and}\ B_{i+1})\),这里的 \(\text{and}\) 表示二进制按位与;

(3)\(\forall 1 \le i < N, (A_i\ \text{or}\ B_i ) \ge (A_{i+1}\ \text{or}\ B_{i+1})\),这里的 \(\text{or}\) ​表示二进制按位或。

请你求出,有多少个满足条件的序列 \(B\)​。由于答案可能很大,你只需要输出其在模 \(10^9+7\) ​意义下的结果。

数据范围:$1 \le M \le 30,1 \le N\le 100,\forall 1 \le i \le N, A_i \in [0,2^M) $。

时间限制:2000ms

空间限制:1024MB

解题思路

首先要有判断从哪个角度入手问题比较可做的能力,可以发现如果想要从 \(B\) 数组入手不太容易,于是考虑从对应的角度去考虑。

boshi:一一对应。

把 \(A\text{ or }B\) 记作 \(C\),\(A\text{ and }B\) 记作 \(D\),不难发现一组合法的 \((C,D)\) 即对应一个满足条件的 \(B\) 序列。而 \(C\) 和 \(D\) 相互独立,于是考虑分别计数。

又由于是位运算相关,故按位考虑,设 \(f_{b,l,r}\) 表示从高到低考虑到第 \(b\) 位,\([l,r]\) 间的数字还是相同的,然后按照下一位枚举断点转移即可。

#include <bits/stdc++.h>
using namespace std; const int N(105), M(30), mod(1e9 + 7); int n, m, a[N];
int f[M][N][N]; inline void read(int &x){
x = 0; int f = 1, c = getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
while(isdigit(c)) x = x * 10 + c - 48, c = getchar();
x *= f;
} inline void MOD(int &x){ x = x + ((x >> 31) & mod); } inline void init(){ memset(f, -1, sizeof(f)); }
int dfs(int b, int l, int r, int op){
if(b == -1) return 1; if(l > r) return 1;
if(~f[b][l][r]) return f[b][l][r];
f[b][l][r] = 0;
int L = r; while(l <= L && ((a[L] >> b) & 1) == op) --L;
for(int i(L); i <= r; ++i)
MOD(f[b][l][r] += 1LL * dfs(b - 1, l, i, op) * dfs(b - 1, i + 1, r, op) % mod - mod);
return f[b][l][r];
} int main(){
freopen("sequence.in", "r", stdin);
freopen("sequence.out", "w", stdout);
read(n), read(m);
for(int i(1); i <= n; ++i) read(a[i]);
int And, Or, ans;
init(), And = dfs(m - 1, 1, n, 1);
init(), Or = dfs(m - 1, 1, n, 0);
ans = 1LL * And * Or % mod;
printf("%d\n", ans);
return 0;
}

[题解] 序列(sequence)的更多相关文章

  1. 洛谷 P4597 序列sequence 解题报告

    P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...

  2. Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence

    Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence 使用oracle11g插入数据时遇到这样一个问题: 1 --创建测试表-- 2 CREATE T ...

  3. Oracle序列(Sequence)创建、使用、修改、删除

    Oracle对象课程:序列(Sequence)创建.使用.修改.删除,序列(Sequence)是用来生成连续的整数数据的对象.序列常常用来作为主键中增长列,序列中的可以升序生成,也可以降序生成.创建序 ...

  4. 序列sequence中的cache问题

    Oracle中序列Sequence的创建语法如下: CREATE SEQUENCE [ schema. ] sequence [ { INCREMENT BY | START WITH } integ ...

  5. oracle数据库--序列(sequence)

    一个问题: 在某张表中,存在一个id列(整数),我们希望在添加记录的时候,该列从1开始,自动的增长,怎么处理? 解决方式:oracle是利用"序列"(sequence)来完成的. ...

  6. Oracle数据库中序列(SEQUENCE)的用法详解

    Oracle数据库中序列(SEQUENCE)的用法详解   在Oracle数据库中,序列的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值.本文我们主要介绍了 ...

  7. Oracle 序列(sequence)

    序列(sequence) 是Oracle提供的用于生成一系列唯一数字的数据库对象.它会自动生成顺序递增或者递减的序列号,以实现自动提供唯一的主键值.序列可以在多用户并发环境中使用,并且可以为所有用户生 ...

  8. oracle 序列sequence

    查询所有的序列: select 'create sequence '||sequence_name|| ' minvalue '||min_value|| ' maxvalue '||max_valu ...

  9. 序列(SEQUENCE)

    序列(SEQUENCE)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字).其主要的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一 ...

随机推荐

  1. 面试问题之C++语言:类模板声明与定义为何不能分开

    C++中每个对象所占用的空间大小,是在编译的时候就确定的,在模板类没有真正的被使用之前,编译器是无法知道,模板类中使用模板类型的对象的所占用的空间的大小的.只有模板被真正使用的时候,编译器才知道,模板 ...

  2. CSS 网站布局

    Flex:https://www.html.cn/archives/8629 Grid:https://www.html.cn/archives/8510/    http://www.ruanyif ...

  3. spring-boot -缓存注解

    缓存:商品信息放到缓存中间件中, 验证码几秒钟有效也是放在缓存中间件. 缓存规范 交互流程: 如果需要使用jRS107需要导入包: java.cache.cache-api JSR107提供的是接口, ...

  4. poll() 方法和 remove() 方法的区别?

    poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败 的时候会返回空,但是 remove() 失败的时候会抛出异常.

  5. 什么是编织(Weaving)?

    为了创建一个 advice 对象而链接一个 aspect 和其它应用类型或对象,称为编 织(Weaving).在 Spring AOP 中,编织在运行时执行.

  6. IIS MVC 发布错误 403.14-Forbidden Web 服务器被配置为不列出此目录的内容

     转:http://blog.csdn.net/csethcrm/article/details/37820135 IIS MVC 发布错误 403.14-Forbidden Web 服务器被配置为不 ...

  7. 【转】ng-class的用法

    原文出处:https://segmentfault.com/a/11... 在开发中我们通常会遇到一种需求:一个元素在不同的状态需要展现不同的样子. 而在这所谓的样子当然就是改变其css的属性,而实现 ...

  8. SVG里的几个实用动画元素的用法

    由于刚刚接触svg,在w3school和菜鸟教程上面的简直是入门的入门,过于简洁,完全不利于学习,所以不得不在网上找了一些文章和资料来看看,对于svg动画这部分完全可以跟css3动画抗衡,现在整理一下 ...

  9. node-webkit文档翻译#package.json

    title: node-webkit文档翻译#package.json date: 2013-12-07 21:38:25 tags: node-webkit 基本示例 { "main&qu ...

  10. 使用 Vuex + Vue.js 构建单页应用【新篇】

    使用 Vuex + Vue.js 构建单页应用[新篇] 在去年的七月六号的时候,发布了一篇 使用 Vuex + Vue.js 构建单页应用 的文章,文章主要是介绍 vuex 的基本使用方法,发现对大部 ...