题意:

  题面中文,不予翻译: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 储能表 记忆化搜索(动态规划)的更多相关文章

  1. 递归 dfs 记忆化搜索 动态规划

    今天做洛谷P1434 [SHOI2002]滑雪 的时候仔细想了想记忆化搜索 现在总结一下 为了描述问题的某一状态,必须用到该状态的上一状态,而描述上一状态,又必须用到上一状态的上一状态……这种用自已来 ...

  2. DFS——>记忆化搜索——>动态规划

    以洛谷P1802  5倍经验日 为例 https://www.luogu.org/problem/show?pid=1802 题目背景 现在乐斗有活动了!每打一个人可以获得5倍经验!absi2011却 ...

  3. [BZOJ1032][P1840] 祖玛 记忆化搜索 动态规划

        描述 Description     某天,小x在玩一个经典小游戏——zumo.zumo游戏的规则是,给你一段长度为n的连续的彩色珠子,珠子的颜色不一定完全相同,但是,如果连续相同颜色的珠子大 ...

  4. 硬币游戏1——打表&&记忆化搜索

    题目 Alice和Bo在玩这样一个游戏,给定 $k$ 个数字 $a_1, a_2,..,a_k$.一开始有 $x$ 枚硬币,Alice和Bob轮流取硬币.每次所取的硬币的枚数一定要在 $k$ 个数当中 ...

  5. BZOJ4513 SDOI2016储能表(数位dp)

    如果n.m.k都是2的幂次方,答案非常好统计.于是容易想到数位dp,考虑每一位是否卡限制即可,即设f[i][0/1][0/1][0/1]为第i位是/否卡n.m.k的限制时,之前的位的总贡献:g[i][ ...

  6. BZOJ4513: [Sdoi2016]储能表

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

  7. bzoj千题计划277:bzoj4513: [Sdoi2016]储能表

    http://www.lydsy.com/JudgeOnline/problem.php?id=4513 f[i][0/1][0/1][0/1] 从高到低第i位,是否卡n的上限,是否卡m的上限,是否卡 ...

  8. BZOJ4513: [Sdoi2016]储能表(数位dp)

    题意 题目链接 Sol 一点思路都没有,只会暴力,没想到标算是数位dp??Orz 首先答案可以分成两部分来统计 设 \[ f_{i,j}= \begin{aligned} i\oplus j & ...

  9. [bzoj4513][SDOI2016]储能表——数位dp

    题目大意 求 \[\sum_{i = 0}^{n-1}\sum_{j=0}^{m-1} max((i\ xor\ j)\ -\ k,\ 0)\ mod\ p\] 题解 首先,开始并没有看出来这是数位d ...

随机推荐

  1. js对象 数组Array详解 (参照MDN官网:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find)

    一:数组的创建方式: 1.采用直接量创建 var arr = [];//创建一个空数组 var arr2 = [1,2,3];//创建一个有三个元素的数组 2.采用构造函数创建 a.var arr1 ...

  2. Ajax登陆,使用Spring Security缓存跳转到登陆前的链接

    Spring Security缓存的应用之登陆后跳转到登录前源地址 什么意思? 用户访问网站,打开了一个链接:(origin url)起源链接 请求发送给服务器,服务器判断用户请求了受保护的资源. 由 ...

  3. Mybatis分页中遇到的坑2

    站在巨人的肩膀上    http://crocutax.com/blog/mybatis-one-to-many-nestes-query-and-page-query Mybatis一对多嵌套查询和 ...

  4. IQueryable 和IEnumberable的区别

    一.IEnumerable接口 公开枚举器,该枚举器支持在指定类型的集合上进行简单的迭代.即:实现了此接口的object,就可以使用foreach遍历该object: 二.IQueryable 接口 ...

  5. Django (九) 项目开发流程&项目架构

    项目开发流程&项目架构 1. 软件开发的一般流程 1. 需求分析及确认: 由需求分析工程师与客户确认甚至挖掘需求.输出需求说明文档. ​ 2. 概要设计及详细设计: 开发对需求进行概要设计,包 ...

  6. __contains__, __len__,__reversed__

    __contains__():当使用in,not in 对象的时候 调用(not in 是在in完成后再取反,实际上还是in操作) class A(object): def __init__(self ...

  7. C8051F_CAN

    CAN总线特点:基于报文编码而非对节点编码,增删节点对系统没有影响,靠干扰稳定性好,速率高. 小工具:CANtool 收发器:CAN总线收发器CTM1050,通信速率1Mbps,至少可连接110个节点 ...

  8. 04.Javascript——入门一些方法记录之iterable

    遍历Array可以采用下标循环,遍历Map和Set就无法使用下标.为了统一集合类型,ES6标准引入了新的iterable类型,Array.Map和Set都属于iterable类型. 具有iterabl ...

  9. Spring使用_进阶

    概述 本文主要写了几个关于Spring Aware,多线程,计划任务(定时任务),条件注解,组合注解,元注解,Spring测试的小例子以及关于@Enable*注解的工作原理的理解. Spring Aw ...

  10. springCloud当中Eureca sever当中Camden到底是什么?

    [学习笔记] 做个普通的maven project,quickstart archetype.改成jdk.8.下面Camden.SR1是版本名,springcloud的版本名称很奇特,它是按照伦敦地铁 ...