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 ...
随机推荐
- Integrated Metabolomics and Lipidomics Analyses Reveal Metabolic Reprogramming in Human Glioma with IDH1 Mutation (文献分享一组-黄旭蕾)
题目:Integrated Metabolomics and Lipidomics Analyses Reveal Metabolic Reprogramming in Human Glioma wi ...
- echarts散点图重叠
今天做echarts图标,使用了散点图.很快实现,发现数据不对,应该是3个的企业,页面只显示了2个,查了半天才发现原来是有两个重叠了.想办法解决了,在网上费劲九牛二虎只力终于找到了解决的方法,下面来解 ...
- 去掉UItalbeview横线
一.去掉UItalbeview中所有横线 // self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; 二.自定义U ...
- 洛谷 P1042 乒乓球
P1042 乒乓球 var s:string; a1:array[1..50000] of char; i,n,x,y:longint; procedure f1; begin while not e ...
- ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第七天(非原创)
文章大纲 一.课程介绍二.Redis基础实战三.Redis之高可用.集群.云平台搭建实战四.淘淘商城Jedis整合spring五.项目源码与资料下载六.参考文章 一.课程介绍 一共14天课程(1) ...
- babel-loader7和babel8版本的问题
根据官网https://www.npmjs.com/package/babel-loader要对应版本 一.babel7.X版本 1.要安装的包 第1套包:npm i babel-core babe ...
- “Debug Assertion” Runtime Error on VS2008 VS2010 winhand.cpp
I'm writing a C++ MFC program on VS2008 and I'm getting this "Debug Assertion Error" when ...
- OpenCV中CvMat的初始化[转]
一)cvCreateMat创建和分配数据CvCreateMat会创建CvMat,并为CvMat分配数据.cvCreateMat可以配合cvInitMatHeader来初始化CvMat对象.因为CvCr ...
- okhttp使用心得(https验证不通过)(一)
之前项目使用的是okhttp3.4版本的,tls协议支持1.0 1.2 等等 后来换成okhttp3.8.1,发现握手失败 找了好多原因之后 发现吧tls加上1.0后,就可以握手成功了,但是tls1 ...
- 再谈Android AsyncTask的优缺点
导语:之前做习惯了Framework层的开发,今天在武汉斗鱼公司面试APP客户端的开发,其中一道题是讲述Asynctask的优缺点,我靠,我只是知道有这么一个东西,会用而已,看来之前的生活太过于安逸, ...