[题解] 序列(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++语言:说一说C++中四种cast转换
C++中四种类型转换是:static_cast.dynamic_cast.const_cast.reinterpret_cast 1.const_cast 常量转换,用于将const变量转为非cons ...
- mysql的cpu飙升原因及处理
Mysql 批量杀死进程 正常情况下kill id,即可,但是有时候某一异常连接特别多的时候如此操作会让人抓狂,下面记录下小方法: use information_schema; select co ...
- 学习 Haproxy (六)
HAProxy HAProxy是免费 高效 可靠的高可用及负载均衡解决方案,该软件非常适合于处理高负载站点的七层数据请求,HAProxy的工作模式使其可以非常容易且安全地集成到我们现有的站点架构中.使 ...
- 学习GlusterFS(一)
一.概述 1.GlusterFS是集群式NAS存储系统,分布式文件系统(POSIX兼容),Tcp/Ip方式互联的一个并行的网络文件系统,通过原生 GlusterFS 协议访问数据,也可以通过 NFS/ ...
- Effective Java —— 多字段下考虑使用建造者模式构建实例
本文参考 本篇文章参考自<Effective Java>第三版第二条"Consider a builder when faced with many constructor pa ...
- Clickhouse 用户自定义外部函数
写在前面 Clickhouse 从 21.11 版本开始,除了提供类似SqlServer.MySQL CREATE FUNCTION 的自定义函数之外,还有一个用户自定义函数(UDF),与其说是&qu ...
- 企业流程再造(BPR)--系统重构
企业流程再造(BPR) 企业流程:指生产或服务过程中一连串活动的工作流程 企业流程再造:对企业流程所进行的根本性的在思考和彻底的再设计,以使企业的速度,质量,服务和成本等关键业绩指标获得根本性的改善
- GoLang数组切片
1. 数组1.1 如何定义数组同java数组一样,数组是一组内存连续且类型相同的数据组成 //不初始化初始值默认为0 var arr1 = [5]int{} var arr2 = [5]int{1,2 ...
- Emscripten教程之入门指导
翻译:云荒杯倾本文是Emscripten-WebAssembly专栏系列文章之一,更多文章请查看专栏.也可以去作者的博客阅读文章.欢迎加入Wasm和emscripten技术交流群,群聊号码:93920 ...
- indexOf返回值问题
String s = "aoood";System.out.println(s.indexOf(""));//返回0 System.out.println(s. ...