【LG4067】[SDOI2016]储能表
【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]储能表的更多相关文章
- BZOJ 4513: [Sdoi2016]储能表 [数位DP !]
4513: [Sdoi2016]储能表 题意:求\[ \sum_{i=0}^{n-1}\sum_{j=0}^{m-1} max((i\oplus j)-k,0) \] 写出来好开心啊...虽然思路不完 ...
- 4513: [Sdoi2016]储能表
4513: [Sdoi2016]储能表 链接 分析: 数位dp. 横坐标和纵坐标一起数位dp,分别记录当前横纵坐标中这一位是否受n或m的限制,在记录一维表示当前是否已经大于k了. 然后需要两个数组记录 ...
- 【BZOJ4513】[Sdoi2016]储能表 数位DP
[BZOJ4513][Sdoi2016]储能表 Description 有一个 n 行 m 列的表格,行从 0 到 n−1 编号,列从 0 到 m−1 编号.每个格子都储存着能量.最初,第 i 行第 ...
- BZOJ4513 SDOI2016 储能表 记忆化搜索(动态规划)
题意: 题面中文,不予翻译:SDOI2016储能表 分析: 据说有大爷用一些奇怪的方法切掉了这道题%%%%% 这里用的是大众方法——动态规划. 其实这是一道类似于二进制数位dp的动态规划题,(但是实际 ...
- BZOJ4513: [Sdoi2016]储能表
Description 有一个 n 行 m 列的表格,行从 0 到 n−1 编号,列从 0 到 m−1 编号.每个格子都储存着能量.最初,第 i 行第 j 列的格子储存着 (i xor j) 点能量. ...
- [SDOI2016]储能表
Description 有一个 n 行 m 列的表格,行从 0 到 n−1 编号,列从 0 到 m−1 编号.每个格子都储存着能量.最初,第 i 行第 j 列的格子储存着 (i xor j) 点能量. ...
- BZOJ.4513.[SDOI2016]储能表(数位DP)
BZOJ 洛谷 切了一道简单的数位DP,终于有些没白做题的感觉了...(然而mjt更强没做过这类的题也切了orz) 看部分分,如果\(k=0\),就是求\(\sum_{i=0}^n\sum_{j=0} ...
- [SDOI2016]储能表——数位DP
挺隐蔽的数位DP.少见 其实减到0不减了挺难处理.....然后就懵了. 其实换个思路: xor小于k的哪些都没了, 只要留下(i^j)大于等于k的那些数的和以及个数, 和-个数*k就是答案 数位DP即 ...
- 4513: [Sdoi2016]储能表 数位DP
国际惯例的题面: 听说这题的正解是找什么规律,数位DP是暴力......好的,我就写暴力了QAQ.我们令f[i][la][lb][lc]表示二进制从高到低考虑位数为i(最低位为1),是否顶n上界,是否 ...
随机推荐
- jQuery中异步请求
1.load方法 使用load()方法通过Ajax请求加载服务器中的数据,并把返回的数据放置到指定的元素中,它的调用格式为: $(selector).load(URL,data,callback); ...
- VC++ UDP网络控制台程序
采用的是VC2008,控制台应用程序,使用UDP编写. 1.服务端代码 //UDPServer.cpp #include <WinSock2.h> #include <stdio. ...
- Ubuntu安装MySQL/MariaDB
安装MariaDB/MySQL MariaDB是MySQL的分支,与MySQL高度兼容,几乎所有的命令都一样.MariaDB是由前MySQL的开发人员离开Sun公司后开发的,目的是为了防止Oracle ...
- Luogu_4197 Peaks
P4197 Peaks 并不会克鲁斯卡尔重构树,于是就写了离线算法. 使用了最小生成树,启发式合并treap 在最小生成树,克鲁斯卡尔算法 时 ,将询问一块处理.便可以保证询问时边的要求.然后利用平衡 ...
- loadrunner脚本中参数化和返回值输出log到外部文件
loadrunner脚本中参数化和返回值输出log到外部文件 很多时候,我们在做性能测试之前,需要造数据,但是使用的这些参数化数据和生成的返回数据在后面的测试都会用的,所以我们需要在造数据过程中,将参 ...
- CTreeCtrl::HitTest
CTreeCtrl::HitTest 调用此函数确定指定的位置点相对树视图控件的工作区的. HTREEITEM HitTest( CPoint pt, UINT* pFlags = NULL ...
- 用画布canvas画安卓logo
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 查询表空间及已使用情況的SQL语句
语句一: select f.tablespace_name tablespace_name, round((d.sumbytes / 1024 / 1024 / 1024), 2) total_g, ...
- Java中的引用:强引用、软引用、弱引用、幻象引用(虚引用)
Java语言中,除了原始数据类型的变量(八大基本数据类型),其他都是引用类型,指向各种不同的对象. 理解引用对于我们掌握Java对象生命周期和JVM内部相关机制都是有帮助的. 不同的应用类型,不同之处 ...
- Linux系统初学-第三课 Linux网络配置1
Linux系统初学-第三课 Linux网络配置 1.动态IP配置 配置文件路径 /etc/sysconfig/network-scripts/ ls查看网卡eth0,其中HWADDR值得获取:ifco ...