[题解] 序列(sequence)
题目大意
给定一个长度为 \(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)的更多相关文章
- 洛谷 P4597 序列sequence 解题报告
P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...
- Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence
Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence 使用oracle11g插入数据时遇到这样一个问题: 1 --创建测试表-- 2 CREATE T ...
- Oracle序列(Sequence)创建、使用、修改、删除
Oracle对象课程:序列(Sequence)创建.使用.修改.删除,序列(Sequence)是用来生成连续的整数数据的对象.序列常常用来作为主键中增长列,序列中的可以升序生成,也可以降序生成.创建序 ...
- 序列sequence中的cache问题
Oracle中序列Sequence的创建语法如下: CREATE SEQUENCE [ schema. ] sequence [ { INCREMENT BY | START WITH } integ ...
- oracle数据库--序列(sequence)
一个问题: 在某张表中,存在一个id列(整数),我们希望在添加记录的时候,该列从1开始,自动的增长,怎么处理? 解决方式:oracle是利用"序列"(sequence)来完成的. ...
- Oracle数据库中序列(SEQUENCE)的用法详解
Oracle数据库中序列(SEQUENCE)的用法详解 在Oracle数据库中,序列的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值.本文我们主要介绍了 ...
- Oracle 序列(sequence)
序列(sequence) 是Oracle提供的用于生成一系列唯一数字的数据库对象.它会自动生成顺序递增或者递减的序列号,以实现自动提供唯一的主键值.序列可以在多用户并发环境中使用,并且可以为所有用户生 ...
- oracle 序列sequence
查询所有的序列: select 'create sequence '||sequence_name|| ' minvalue '||min_value|| ' maxvalue '||max_valu ...
- 序列(SEQUENCE)
序列(SEQUENCE)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字).其主要的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一 ...
随机推荐
- 面试问题之C++语言:volatile关键字的作用
volatile的作用 volatile关键字是防止在共享的空间发生读取的错误.只保证其可见性,不保证原子性:使用volatile指每次从内存中读取数据,而不是从编译器优化后的缓存中读取数据,简单来讲 ...
- 什么是redis的缓存雪崩与缓存穿透?如何解决?
一.缓存雪崩 1.1 什么是缓存雪崩? 首先我们先来回答一下我们为什么要用缓存(Redis): 1.提高性能能:缓存查询是纯内存访问,而硬盘是磁盘访问,因此缓存查询速度比数据库查询速度快 2.提高并发 ...
- Java动态代理和CGLib代理
本文参考 在上一篇"Netty + Spring + ZooKeeper搭建轻量级RPC框架"文章中涉及到了Java动态代理和CGLib代理,在这篇文章中对这两种代理方式做详解 下 ...
- Python - 异常处理初步
- JavaScript & 6小时了解ES6基本语法
一步一步似爪牙. 前言 学习es6之前我们可能并不知道es6相比es5差距在哪, 但是这并不妨碍我们站在巨人的肩膀上; 程序员就是要乐于尝鲜; 学习es6最终目的是结合es5 一起进行工程项目开发, ...
- 使用Egret插件压缩代码包体积,减少请求数量的实战教程
在白鹭引擎发布了5.2.7版本中新增加了命令行,增加自动合图插件TextureMergerPlugin功能.今天,我们以一个EUI案例来展示自动合图插件的具体使用方法和注意事项. 此外,我们在本文还融 ...
- 前端面试题整理——手写简易jquery
class jQuery { constructor(selector) { const result = document.querySelectorAll(selector) console.lo ...
- 在tomcat布置项目
1.将项目打成war包复制到tomcat-webapps 2.修改tomcat端口号 3.指定jdk 一.找到tomcat目录/bin 文件夹下的 catalina.bat文件 二.在文件中找到 ec ...
- DOCTYPE(⽂档类型) 的作⽤
DOCTYPE是HTML5中一种标准通用标记语言的文档类型声明,它的目的是告诉浏览器(解析器)应该以什么样(html或xhtml)的文档类型定义来解析文档,不同的渲染模式会影响浏览器对 CSS 代码甚 ...
- ubuntu连接不到WiFi
ubuntu连接不到WiFi 在软件与更新中,进入附加驱动. 搜到对应的无线网卡驱动,安装后在重启电脑.