【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. php初学习

    1.搭建环境:下载wamp5,然后下载安装,安装成功后在电脑的右下角会出现一个方向盘的图标,右键langage选择chinese,然后就可以用了

  2. 1221. [HNOI2001]软件开发【费用流】

    Description 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员 ...

  3. Tomcat中日志组件

    Tomcat日志组件 AccessLog接口 public interface AccessLog { public void log(Request request, Response respon ...

  4. Linux API fork 子进程 创建 & 无名管道通信

    #include<unistd.h> #include<stdio.h> int main() { ]; ]; pipe(filedes); printf("my p ...

  5. 学习VCL之路(1)

    在TObject类中,有一个Dispatch()方法和一个DefaultHandler()方法,它们都是与消息分发机制相关的. Dispatch()负责将特定的消息分发给合适的消息处理函数.首先它会在 ...

  6. 全面理解 ASP.NET Core 依赖注入 (转载)

    DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET  Core的DI实现以及对实例 ...

  7. iOS之在本地搭建IPv6环境测试你的app

    IPv6的简介 IPv4 和 IPv6的区别就是 IP 地址前者是 .(dot)分割,后者是以 :(冒号)分割的(更多详细信息自行搜索). PS:在使用 IPv6 的热点时候,记得手机开 飞行模式 哦 ...

  8. OO 第五、六、七次作业总结

    第五次作业 算法与实现 这次的电梯因为要使用系统时间进行模拟,所以又是推倒了之前的重写的.最后采用三个电梯线程,一个调度线程,一个输入线程的方式. 源码分析图示 类图 方法分析 类分析 由上图看,由于 ...

  9. Extjs6 怎么重写框架的类

    创建一个覆写(override)类的推荐方法如下: Ext.define('MyApp.overrides.panel.Panel', { override: 'Ext.panel.Panel', c ...

  10. PHP连接mysql8.0出错“SQLSTATE[HY000] [2054] The server requested authentication method unknow.....

    这个错可能是mysql默认使用 caching_sha2_password作为默认的身份验证插件,而不再是 mysql_native_password,但是客户端暂时不支持这个插件导致的. 解决方法一 ...