题意:

  题面中文,不予翻译: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. SpringBoot2.0 整合 QuartJob ,实现定时器实时管理

    一.QuartJob简介 1.一句话描述 Quartz是一个完全由java编写的开源作业调度框架,形式简易,功能强大. 2.核心API (1).Scheduler 代表一个 Quartz 的独立运行容 ...

  2. 多线程 NSThread 了解

    用NSThread创建子线程的3种方法   //  DYFViewController.m //  623-02-pthread // //  Created by dyf on 14-6-23. / ...

  3. Codeforces 1138B(列方程枚举)

    构造模拟要分情况讨论感觉不是够本质,然后官解是因为只有四个量所以可以根据限制条件列两个方程,再枚举一下解就可以了. const int maxn = 5000 + 5; int n, c[maxn], ...

  4. mysql写存储过程并定时调用

    设置一个定时任务:运行以下SQL -- 创建一个表test:字段endtime CREATE TABLE test (endtime DATETIME);   -- 创建函数 :向test插入endt ...

  5. cucumber 背景和场景的区别

    背景是公用的,每个场景都会执行,相当于前提条件: 场景是一个单独的case 别人的cucumber学习总结: 链接:http://ruby-china.org/topics/7119

  6. jQuery3.2.1 和2.0和 1区别

    1. 移除旧的IE工作区新的最终版最主要的目标是更加快速,更加时尚,因此,那些支持早于IE9版本的相关技术与工作区都被移除了.这意味着如果你想要或者需要支持IE6-8,你必须用回1.12版本,因为甚至 ...

  7. 断言assert用法

    本文转自:http://blog.jobbole.com/76285/ 这个问题是如何在一些场景下使用断言表达式,通常会有人误用它,所以我决定写一篇文章来说明何时使用断言,什么时候不用. 为那些还不清 ...

  8. 1、二维数组中的查找------------>剑指offer系列

    题目 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...

  9. [Rational Rose 2007]解决启动报”解决无法启动此程序因为丢失suite objects.dll“的问题

    问题根源1:不是丢失suite objects.dll文件,而是环境变量配置错误或无配置 假如安装目录如:C:\Program Files\Rational 需要配置环境变量的路径为:C:\Progr ...

  10. selenium-Python之鼠标事件

    通过click()来模拟鼠标的单击操作,鼠标还具有鼠标右击,双击,悬停甚至鼠标拖动等功能.在webdriver中,将这些鼠标操作方法封装在ActionChains类提供. ActionChains类提 ...