牛客 P21336 和与或 (数位dp)
大意: 给定数组$R$, 求有多少个数组$A$, 满足$0\le A_i \le R_i$且$A_0+...+A_{N-1}=A_0\space or ...\space or \space A_{N-1}$.
题目条件等价于对于任意的$i,j$, 有$A_i and A_j = 0$, 所以每个二进制位上为$1$的最多只有一个数, 然后跑一次二进制数位$dp$即可.
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string.h>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define PER(i,a,n) for(int i=n;i>=a;--i)
using namespace std;
typedef long long ll;
const int P = 1e9+9; int n, dp[70][2000];
ll r[20]; //dp[x][y] 表示从二进制最高位填到第d位时, 无限制的a[i]的状态为now的方案数.
int dfs(int d, int now) {
if (d<0) return 1;
int &ans = dp[d][now];
if (~ans) return ans;
int nxt = now;
REP(i,0,n-1) if (r[i]>>d&1) nxt |= 1<<i;
//第d位全为0的方案数
ans = dfs(d-1,nxt);
REP(i,0,n-1) {
//a[i]的第d位为1的方案数
if (now>>i&1) {
//a[i]无限制, 则下一步全无限制
ans = (ans+dfs(d-1,nxt))%P;
}
else if (nxt>>i&1) {
//a[i]有限制, 且r[i]的第d位为1, 则下一步a[i]还有限制
ans = (ans+dfs(d-1,nxt^(1<<i)))%P;
}
//a[i]有限制, 且r[i]的第d位为0, 不能填1
}
return ans;
} int main() {
scanf("%d", &n);
REP(i,0,n-1) scanf("%lld", r+i);
memset(dp,-1,sizeof dp);
printf("%d\n", dfs(60,0));
}
牛客 P21336 和与或 (数位dp)的更多相关文章
- 2018牛客27---D---愤怒: (有关子序列的dp问题)
链接:https://www.nowcoder.com/acm/contest/188/D来源:牛客网 题目描述 小w很生气 小w有一个长为n的括号序列 愤怒小w想把这个括号序列分为两个括号序列 小w ...
- 牛客练习赛26B 烟花 (概率DP)
链接:https://ac.nowcoder.com/acm/contest/180/B 来源:牛客网 烟花 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5 ...
- 牛客网练习赛26B(简单的dp)
题目链接:https://www.nowcoder.com/acm/contest/180/B 链接:https://www.nowcoder.com/acm/contest/180/B来源:牛客网 ...
- 牛客多校2 D-money(dp记录/贪心)
D-money 链接:https://www.nowcoder.com/acm/contest/140/D来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K, ...
- 牛客练习赛52 | C | [烹饪] (DP,裴蜀定理,gcd)
牛客练习赛52 C 烹饪 链接:https://ac.nowcoder.com/acm/contest/1084/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 327 ...
- 牛客 被3整除的子序列dp
题意很清楚,直接dp即可,dp[i][j]表示到第i个字符的状态为j的方案数,这里状态指的是子序列最大下标到第i直接dp即可,dp[i][j]表示到第i个字符的状态为j的方案数,这里状态指的是子序列最 ...
- 牛客练习赛37-筱玛的字符串-DP递推
筱玛的字符串 思路 :dp [ i ] [ j ] [ 3 ] 分别代表到第 i 位时 左括号比右括号多 j ,后面有三个状态 分别表示当前位置 S3的字符 是正在反转的,还是 反转完成的,还是没有反 ...
- 牛客 26C 手铐 (缩环, 树形dp)
先缩环建树, 对于树上个环$x,y$, 假设$x,y$路径上有$cnt$个环(不包括$x,y$), 贡献就为$2^{cnt}$. 这题卡常挺严重的, 刚开始用并查集合并竟然T了. #include & ...
- 牛客 70E 乌龟跑步 (bitset优化dp)
有一只乌龟,初始在0的位置向右跑. 这只乌龟会依次接到一串指令,指令T表示向后转,指令F表示向前移动一个单位.乌龟不能忽视任何指令.现在我们要修改其中正好n个指令(一个指令可以被改多次,一次修改定义为 ...
随机推荐
- Servlet中接收和返回数据
public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest re ...
- linux安装maven简易步骤
版本要求maven3.6.1 软件下载 wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.1/binaries/apache-maven-3 ...
- vim 永久显示行号 & 临时显示行号
在linux环境下,vim是常用的代码查看和编辑工具.在程序编译出错时,一般会提示出错的行号,但是用vim打开的代码确不显示行号,错误语句的定位非常不便.那么怎样才能让vim显示代码的行号呢? 1 临 ...
- NodeJS的exports、module.exports与ES6的export、export default深入详解
前言 决定开始重新规范的学习一下node编程.但是引入模块我看到用 require的方式,再联想到咱们的ES6各种export .export default. 阿西吧,头都大了.... 头大完了,那 ...
- 问题MySQL Error (2013): Lost connection to MySQL server at waiting for initial communication packet
错误说明: SQL Error (2013): Lost connection to MySQL server at 'waiting for initial communication packet ...
- 【转】netty4.1.32 pipeline的添加顺序和执行顺序
原文:https://www.cnblogs.com/ruber/p/10186571.html 本文只想讨论一下pipeline的执行顺序问题,因为这个搞不明白就不知道先添加编码还是解码,是不是可以 ...
- vi启动时报错:YouCompleteMe unavailable: requires Vim 7.4.1578+如何处理?
答:源码编译安装最新的vim 以redhat为例: 1. 移除旧的vi,vim sudo yum remove vi vim -y 2. 安装ncurses库 sudo yum install ncu ...
- SQL-W3School-高级:SQL RIGHT JOIN 关键字
ylbtech-SQL-W3School-高级:SQL RIGHT JOIN 关键字 1.返回顶部 1. SQL RIGHT JOIN 关键字 RIGHT JOIN 关键字会右表 (table_nam ...
- features its own
Gulp.js features its own built-in watch() method - no external plugin required ---- However, the Arn ...
- 012-Spring Boot web【一】web项目搭建、请求参数、RestController、使用jsp、freemarker,web容器tomcat和jetty
一.项目搭建 同:http://www.cnblogs.com/bjlhx/p/8324971.html 1)新建maven项目→使用默认配置即可 定义好项目名称等 2)修改jdk版本 <pro ...