[题解] 序列(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)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字).其主要的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一 ...
随机推荐
- Dubbo Monitor 实现原理?
Consumer 端在发起调用之前会先走 filter 链:provider 端在接收到请求时也是 先走 filter 链,然后才进行真正的业务逻辑处理. 默认情况下,在 consumer 和 pro ...
- java常用方法集合
1.获取当前日期 // 获取当前日期 public Date getDate(int num) { Calendar cal = new GregorianCalendar(); cal.setTim ...
- Redis6.0配置文件翻译(Google手动翻译)
原文链接(一般情况下你打不开这个网页):https://raw.githubusercontent.com/redis/redis/6.0/redis.conf Redis配置文件 请注意,为了读取配 ...
- java-可变参数hei
/* 使用前提: 当前方法的参数的数据类型已经确定,但是参数的个数不确定,就可以使用可变参数 使用格式: 定义方法是使用 修饰符 返回类型 方法名(数据类型... 变量名){} 可变参数的原理: 可变 ...
- css3中什么时候用transition什么时候用animation实现动画
在css3中transition和animation都可以实现动画效果,但是我们什么时候用transition,什么时候用animation. 当有事件触发动画的时候我们就用transition.比如 ...
- javascript 理解和使用回调函数
在javascript中,function是内置的类对象,也就是说它是一种类型的对象,可以和其他String.Array.Number.Objec类的对象一样用于内置对象的管理.因为function实 ...
- 微信小程序实时通讯(websocket)问题
这几天值班忙的不要不要,人工智能这块看的都是零零散散,今天就来写写小程序的实时通讯吧.小程序端://这个是连接 lianjie:function(){ var socketOpen = false / ...
- java中请给出一个抽象类,可以继承实体类的例子
例1.7.2(抽象类可以继承实体类)- class VehMark_to_win { void steer() { System.out.println("Turn st ...
- java中的方法(method)到底怎么用?给个例子
7.方法(method) 被调例子, int add(int x, int y){ return x+y; } 主调例子, for example: int result = add(5,3); ...
- java基础-多线程 等待唤醒机制
/** * @param args * 等待唤醒机制 */ public static void main(String[] args) { final Printer p = new ...