【LG4067】[SDOI2016]储能表

题面

洛谷

题解

这种$n$、$m$出奇的大的题目一看就是数位$dp$啦

其实就是用一下数位$dp$的套路

设$f[o][n][m][k]$表示当前做到第$i$位卡不卡$n,m,k$的界

其中$f$是个$pair$一维存方案数、一位存数值

然后按照普通套路$dfs$即可

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std; template <typename T>
void read(T &x) {
int op = 1; x = 0; char ch = getchar();
while (!isdigit(ch)) { if (ch == '-') op = -1; ch = getchar(); }
while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
x *= op;
}
typedef long long ll;
typedef pair<ll, ll> P;
ll N, M, K, Mod;
int mx;
P f[70][2][2][2];
bool vis[70][2][2][2];
void pls(ll &x, ll y) { x += y; if (x >= Mod) x -= Mod; }
P dfs(int o, bool n, bool m, bool k) {
if (o > mx) return make_pair(1, 0);
if (vis[o][n][m][k]) return f[o][n][m][k];
vis[o][n][m][k] = 1;
int lim_n = n ? ((N >> mx - o) & 1) : 1, lim_m = m ? ((M >> mx - o) & 1) : 1, lim_k = k ? ((K >> mx - o) & 1) : 1;
for (int i = 0; i <= lim_n; i++)
for (int j = 0; j <= lim_m; j++) {
if (k && lim_k > (i ^ j)) continue;
P p = dfs(o + 1, n && (i == lim_n), m && (j == lim_m), k && ((i ^ j) == lim_k));
pls(f[o][n][m][k].first, p.first);
pls(f[o][n][m][k].second, ((1ll << mx - o) * (i ^ j) % Mod * p.first % Mod + p.second) % Mod);
}
return f[o][n][m][k];
}
int main () {
int T; read(T);
while (T--) {
read(N), read(M), read(K), read(Mod);
memset(vis, 0, sizeof(vis));
memset(f, 0, sizeof(f));
N--, M--; ll n = N, m = M, k = K; int res = 0; mx = 0;
while (n) ++res, n >>= 1ll; mx = max(mx, res), res = 0;
while (m) ++res, m >>= 1ll; mx = max(mx, res), res = 0;
while (k) ++res, k >>= 1ll; mx = max(mx, res);
P ans = dfs(1, 1, 1, 1);
printf("%lld\n", (1ll * ans.second - 1ll * K % Mod * ans.first % Mod + Mod) % Mod);
}
return 0;
}

【LG4067】[SDOI2016]储能表的更多相关文章

  1. BZOJ 4513: [Sdoi2016]储能表 [数位DP !]

    4513: [Sdoi2016]储能表 题意:求\[ \sum_{i=0}^{n-1}\sum_{j=0}^{m-1} max((i\oplus j)-k,0) \] 写出来好开心啊...虽然思路不完 ...

  2. 4513: [Sdoi2016]储能表

    4513: [Sdoi2016]储能表 链接 分析: 数位dp. 横坐标和纵坐标一起数位dp,分别记录当前横纵坐标中这一位是否受n或m的限制,在记录一维表示当前是否已经大于k了. 然后需要两个数组记录 ...

  3. 【BZOJ4513】[Sdoi2016]储能表 数位DP

    [BZOJ4513][Sdoi2016]储能表 Description 有一个 n 行 m 列的表格,行从 0 到 n−1 编号,列从 0 到 m−1 编号.每个格子都储存着能量.最初,第 i 行第 ...

  4. BZOJ4513 SDOI2016 储能表 记忆化搜索(动态规划)

    题意: 题面中文,不予翻译:SDOI2016储能表 分析: 据说有大爷用一些奇怪的方法切掉了这道题%%%%% 这里用的是大众方法——动态规划. 其实这是一道类似于二进制数位dp的动态规划题,(但是实际 ...

  5. BZOJ4513: [Sdoi2016]储能表

    Description 有一个 n 行 m 列的表格,行从 0 到 n−1 编号,列从 0 到 m−1 编号.每个格子都储存着能量.最初,第 i 行第 j 列的格子储存着 (i xor j) 点能量. ...

  6. [SDOI2016]储能表

    Description 有一个 n 行 m 列的表格,行从 0 到 n−1 编号,列从 0 到 m−1 编号.每个格子都储存着能量.最初,第 i 行第 j 列的格子储存着 (i xor j) 点能量. ...

  7. BZOJ.4513.[SDOI2016]储能表(数位DP)

    BZOJ 洛谷 切了一道简单的数位DP,终于有些没白做题的感觉了...(然而mjt更强没做过这类的题也切了orz) 看部分分,如果\(k=0\),就是求\(\sum_{i=0}^n\sum_{j=0} ...

  8. [SDOI2016]储能表——数位DP

    挺隐蔽的数位DP.少见 其实减到0不减了挺难处理.....然后就懵了. 其实换个思路: xor小于k的哪些都没了, 只要留下(i^j)大于等于k的那些数的和以及个数, 和-个数*k就是答案 数位DP即 ...

  9. 4513: [Sdoi2016]储能表 数位DP

    国际惯例的题面: 听说这题的正解是找什么规律,数位DP是暴力......好的,我就写暴力了QAQ.我们令f[i][la][lb][lc]表示二进制从高到低考虑位数为i(最低位为1),是否顶n上界,是否 ...

随机推荐

  1. iOS 技能分类:

    1.语言与系统: 2.架构与机制: 3.性能:cpu.gpu.io.缓存.内存:性能监测工具: 4.知名开源库:

  2. bzoj4403:序列统计

    我好傻啊 题目 先来看看长度只能为\(n\)的情况 那么答案非常显然是\(\binom{m+n-1}{n}\) 其中\(m=R-L+1\) 因为我们要构造一个非降序列,显然可能一个数会被选择多次,组合 ...

  3. luogu P3381【模板】最小费用最大流

    嘟嘟嘟 没错,我开始学费用流了! 做法也是比较朴素的\(spfa\). 就是每一次以费用为权值跑一遍\(spfa\)找到一条最短路,然后把这条道全流满,并把这一次的流量和费用累加到答案上.因此我们需要 ...

  4. MyBatis(2)-全局配置文件

    本文的代码是在MyBatis(1)-简单入门基础之上进行学习的,如有不懂请先看此博文MyBatis(1)-简单入门! 1)配置文件的安装 --->在联网的情况下,点击去下载http://myba ...

  5. indexzero/http-server-1-简介

    ethereumjs-vm的例子有用到这个 看完ethereumjs-vm,再看他ethereumjs/browser-builds,然后最后看他http-server,然后就能了解ethereumj ...

  6. 人人开源之renren-security

    renren-security,从这周开始我将要对其比较详细的研究,之前的研究只不过是比较浅的.正如在这篇文章读读<编写高质量代码:改善Java程序的151条建议>中说过不要重复造轮子. ...

  7. [教程] macOS打开原生的NTFS读写功能

    Mac本身实际上是支持原生的NTFS读写的,只不过这一功能被隐藏了,但是可以手动打开,这比第三方的的工具要安全得多,有时第三方工具可能会发生整个NTFS分区数据丢失的情况,下面是打开MAC原生NTFS ...

  8. 如何在Ubuntu中添加中文输入法

    首先打开终端,输入以下命令 打开终端输入以下命令 弹出设置IBus首选项对话框,单击输入法文本框,再单击添加按钮,选中汉语中的拼音,单击添加,设置完毕. 最后单击输入法图标的选项中的首选项中的拼音模式 ...

  9. PHP面试系列 之框架(一)---- MVC框架基本工作原理

    题:谈谈你对MVC的认识,介绍集中目前比较流行的MVC框架 考点: (1)MVC工作原理 (2)常见MVC框架 延伸: (1)单一入口的工作原理 (2)模板引擎的理解 (1)MVC工作原理 Model ...

  10. linux系统安装redis服务器与php redis扩展

    一 安装redis服务 1更新yum源 CentOS/RHEL 7.x: rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-lat ...