BZOJ4513 SDOI2016 储能表 记忆化搜索(动态规划)
题意:
题面中文,不予翻译:SDOI2016储能表
分析:
据说有大爷用一些奇怪的方法切掉了这道题%%%%%
这里用的是大众方法——动态规划。
其实这是一道类似于二进制数位dp的动态规划题,(但是实际上还不是特别典型的数位dp)这里就要我们对问题的深入理解。
如果我们按照思路进程来发展的话,首先,我们会想到把求和式和k拆开,先求出所有大于k的(i^j)的和,然后减去若干个k。
我们怎样去数这个数呢?
逐位分析,用数位dp的手段,要判断i是否卡n的上界,j是否卡m的上界,以及i^j是否卡k这个下界,我们需要统计两个东西。
1. 合法的,对答案有贡献的方案数
2. 合法的,对答案有贡献的方案的总贡献。
所以我们需要dp两个数组,f[len][1/0][1/0][1/0]表示考虑的第len位是否卡n的第len位(上界),是否卡m的第len位(上界),是否卡k的第len位(下界)时的方案数,和g[len][1/0][1/0][1/0]表示的是相应状态的总贡献。
那么我们按照数位dp的思路去做记忆化搜索,最后的答案就是
ans = g[1][1][1][1] - k* f[1][1][1][1]. (当然记得取模)
代码:
#include<bits/stdc++.h>
#define ll long long
#define pi pair<int,int>
#define mp(x,y) make_pair(x,y)
using namespace std;
const int N=;
bool vis[N][][][];int t,mod,ml;
ll n,m,nn,mm,k,kk;pi f[N][][][];
void add(int &x,int y){
x+=y;if(x>=mod) x-=mod;
} pi dp(int len,bool n1,bool m1,bool k1){
if(len>ml) return mp(,);
if(vis[len][n1][m1][k1])
return f[len][n1][m1][k1];
vis[len][n1][m1][k1]=;
int np=(n>>ml-len)&,mp=(m>>ml-len)&,
kp=(k>>ml-len)&;
for(int i=;i<=(n1?np:);i++)
for(int j=;j<=(m1?mp:);j++){
if(k1&&(i^j)<kp) continue;
pi nw=dp(len+,n1&&(i==np),
m1&&(j==mp),k1&&((i^j)==kp));
add(f[len][n1][m1][k1].first,nw.first);
add(f[len][n1][m1][k1].second,
((1ll<<ml-len)*(i^j)%mod*
nw.first+nw.second)%mod);
} return f[len][n1][m1][k1];
} int main(){
scanf("%d",&t);while(t--){
memset(vis,,sizeof(vis));
memset(f,,sizeof(f));
scanf("%lld%lld%lld%d",&n,&m,&k,&mod);
n--;m--;int nw=;nn=n,mm=m,kk=k;
while(nn) nw++,nn/=;
ml=max(nw,ml);nw=;
while(mm) nw++,mm/=;
ml=max(nw,ml);nw=;
while(kk) nw++,kk/=;
ml=max(nw,ml);pi ans=dp(,,,);
printf("%d\n",(1ll*ans.second-1ll*k%mod*
ans.first%mod+mod)%mod);
} return ;
}
数位dp
BZOJ4513 SDOI2016 储能表 记忆化搜索(动态规划)的更多相关文章
- 递归 dfs 记忆化搜索 动态规划
今天做洛谷P1434 [SHOI2002]滑雪 的时候仔细想了想记忆化搜索 现在总结一下 为了描述问题的某一状态,必须用到该状态的上一状态,而描述上一状态,又必须用到上一状态的上一状态……这种用自已来 ...
- DFS——>记忆化搜索——>动态规划
以洛谷P1802 5倍经验日 为例 https://www.luogu.org/problem/show?pid=1802 题目背景 现在乐斗有活动了!每打一个人可以获得5倍经验!absi2011却 ...
- [BZOJ1032][P1840] 祖玛 记忆化搜索 动态规划
描述 Description 某天,小x在玩一个经典小游戏——zumo.zumo游戏的规则是,给你一段长度为n的连续的彩色珠子,珠子的颜色不一定完全相同,但是,如果连续相同颜色的珠子大 ...
- 硬币游戏1——打表&&记忆化搜索
题目 Alice和Bo在玩这样一个游戏,给定 $k$ 个数字 $a_1, a_2,..,a_k$.一开始有 $x$ 枚硬币,Alice和Bob轮流取硬币.每次所取的硬币的枚数一定要在 $k$ 个数当中 ...
- BZOJ4513 SDOI2016储能表(数位dp)
如果n.m.k都是2的幂次方,答案非常好统计.于是容易想到数位dp,考虑每一位是否卡限制即可,即设f[i][0/1][0/1][0/1]为第i位是/否卡n.m.k的限制时,之前的位的总贡献:g[i][ ...
- BZOJ4513: [Sdoi2016]储能表
Description 有一个 n 行 m 列的表格,行从 0 到 n−1 编号,列从 0 到 m−1 编号.每个格子都储存着能量.最初,第 i 行第 j 列的格子储存着 (i xor j) 点能量. ...
- bzoj千题计划277:bzoj4513: [Sdoi2016]储能表
http://www.lydsy.com/JudgeOnline/problem.php?id=4513 f[i][0/1][0/1][0/1] 从高到低第i位,是否卡n的上限,是否卡m的上限,是否卡 ...
- BZOJ4513: [Sdoi2016]储能表(数位dp)
题意 题目链接 Sol 一点思路都没有,只会暴力,没想到标算是数位dp??Orz 首先答案可以分成两部分来统计 设 \[ f_{i,j}= \begin{aligned} i\oplus j & ...
- [bzoj4513][SDOI2016]储能表——数位dp
题目大意 求 \[\sum_{i = 0}^{n-1}\sum_{j=0}^{m-1} max((i\ xor\ j)\ -\ k,\ 0)\ mod\ p\] 题解 首先,开始并没有看出来这是数位d ...
随机推荐
- PHP实现用户登录页面
PHP学习日常,放在上面记录一下咯 我用了bootstrap框架,这样的界面要好看一点 登录页面: 必须用户名.密码.验证码都输入正确才能登录成功喔,否则出现下面提示 登陆成功之后,登录和注册选项切换 ...
- 黑马函数式接口学习 Stream流 函数式接口 Lambda表达式 方法引用
- C - Heavy Transportation
//改版dijkstra #include <iostream> #include <algorithm> #define Faster ios::sync_with_stdi ...
- 51Nod 1134 最长递增子序列(动态规划O(nlogn))
#include <iostream> #include <algorithm> #include <stdio.h> #define MAXN 50010 usi ...
- Flask (七) 部署
阿里云部署Flask项目 部署Flask项目和部署Django项目基本一致,我们也使用uwsgi+nginx 我们在部署Django项目基础上部署Flask项目 1, 将uwsgi.ini ...
- ZJOI2017 day2 T2 线段树 想法题
考完D2发现自己简直zz了...花式扔基本分 首先这道题有个显然的套路:树上一些点到一个定点的距离和=这些点深度和+点数*定点深度和-2*lca深度和 ——上一次见这个套路是LNOI2014,上次做的 ...
- Java内置锁和简单用法
一.简单的锁知识 关于内置锁 Java具有通过synchronized关键字实现的内置锁,内置锁获得锁和释放锁是隐式的,进入synchronized修饰的代码就获得锁,走出相应的代码就释放锁. jav ...
- HashMap的小总结 + 源码分析
一.HashMap的原理 所谓Map,就是关联数组,存的是键值对——key&value. 实现一个简单的Map,你也许会直接用两个LIst,一个存key,一个存value.然后做查询或者get ...
- Incorrect configuration: namenode address dfs.namenode.servicerpc-address or dfs.namenode.rpc-address is not configured.
在搭建Hadoop集群的时候,遇到了这样的一个报错. 就在启动HDFS调用命令: start-dfs.sh 的时候,报错: 然后输密码就一直很奇怪,反正一直运行不成功. 百度了半天,确定是core-s ...
- springmvc 实现原理与struts2原理的区别
spring mvc的入口是servlet,而struts2是filter,这样就导致了二者的机制不同. spring mvc是基于方法的设计,sturts2是基于类设计的. springmvc将ur ...