挺隐蔽的数位DP。少见

其实减到0不减了挺难处理。。。。。然后就懵了。

其实换个思路:

xor小于k的哪些都没了,

只要留下(i^j)大于等于k的那些数的和以及个数,

和-个数*k就是答案

数位DP即可

f[i][0/1][0/1][0/1]表示,前i位,对n,m,k有无限制<=n,<=m,>=k?,xor值的总和

g[i][0/1][0/1][0/1]表示,前i位,对n,m,k有无限制<=n,<=m,>=k?,合法的方案数

然后枚举这一位的n,m数位填什么转移

注意爆int和爆long long:
1.1<<p爆int,这个还很大,必须立刻取模

2.最后tmp*k爆long long,k先对p取模

不稳啊~~

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define int long long
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(ll &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=;
ll n,m,k;
ll mod;
ll f[N][][][];
ll g[N][][][];
int main(){
int t;
rd(t);
while(t--){
scanf("%lld%lld%lld%lld",&n,&m,&k,&mod);
--n;--m;
memset(g,,sizeof g);memset(f,,sizeof f);
g[][][][]=;
for(reg p=;p>=;--p){
int nn=(n>>p)&1LL,nm=(m>>p)&1LL,nk=(k>>p)&1LL;
// cout<<" wei "<<p<<endl;
// cout<<nn<<" "<<nm<<" "<<nk<<endl;
for(reg i=;i<=;++i){//i
for(reg j=;j<=;++j){//j
for(reg l=;l<=;++l){//lim n
for(reg r=;r<=;++r){//lim m
for(reg o=;o<=;++o){//lim k
if((l&&i>nn)||(r&&j>nm)||(o&&((i^j)<nk))) continue;
(f[p][((!l)||(i<nn))?:][((!r)||(j<nm))?:][((!o)||((i^j)>nk))?:]+=(f[p+][l][r][o]+(ll)(i^j)*(1LL*<<p)%mod*g[p+][l][r][o]%mod)%mod)%=mod;
(g[p][((!l)||(i<nn))?:][((!r)||(j<nm))?:][((!o)||((i^j)>nk))?:]+=(g[p+][l][r][o]))%=mod;
}
}
}
}
}
}
ll ans=;
ll tmp=;
for(reg l=;l<=;++l){//lim n
for(reg r=;r<=;++r){//lim m
for(reg o=;o<=;++o){//lim k
(ans+=f[][l][r][o])%=mod;
(tmp+=g[][l][r][o])%=mod;
}
}
}
k%=mod;
ans=(ans%mod-tmp%mod*k%mod+mod)%mod;
printf("%lld\n",ans%mod);
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/2/26 18:48:55
*/

如果想到统计<=k的和和个数的话,就是一个限制比较多(维度多)的数位DP罢了。

[SDOI2016]储能表——数位DP的更多相关文章

  1. BZOJ 4513: [Sdoi2016]储能表 [数位DP !]

    4513: [Sdoi2016]储能表 题意:求\[ \sum_{i=0}^{n-1}\sum_{j=0}^{m-1} max((i\oplus j)-k,0) \] 写出来好开心啊...虽然思路不完 ...

  2. 【BZOJ4513】[Sdoi2016]储能表 数位DP

    [BZOJ4513][Sdoi2016]储能表 Description 有一个 n 行 m 列的表格,行从 0 到 n−1 编号,列从 0 到 m−1 编号.每个格子都储存着能量.最初,第 i 行第 ...

  3. BZOJ.4513.[SDOI2016]储能表(数位DP)

    BZOJ 洛谷 切了一道简单的数位DP,终于有些没白做题的感觉了...(然而mjt更强没做过这类的题也切了orz) 看部分分,如果\(k=0\),就是求\(\sum_{i=0}^n\sum_{j=0} ...

  4. 4513: [Sdoi2016]储能表 数位DP

    国际惯例的题面: 听说这题的正解是找什么规律,数位DP是暴力......好的,我就写暴力了QAQ.我们令f[i][la][lb][lc]表示二进制从高到低考虑位数为i(最低位为1),是否顶n上界,是否 ...

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

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

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

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

  7. 4513: [Sdoi2016]储能表

    4513: [Sdoi2016]储能表 链接 分析: 数位dp. 横坐标和纵坐标一起数位dp,分别记录当前横纵坐标中这一位是否受n或m的限制,在记录一维表示当前是否已经大于k了. 然后需要两个数组记录 ...

  8. 【LG4067】[SDOI2016]储能表

    [LG4067][SDOI2016]储能表 题面 洛谷 题解 这种$n$.$m$出奇的大的题目一看就是数位$dp$啦 其实就是用一下数位$dp$的套路 设$f[o][n][m][k]$表示当前做到第$ ...

  9. BZOJ4513 SDOI2016 储能表 记忆化搜索(动态规划)

    题意: 题面中文,不予翻译:SDOI2016储能表 分析: 据说有大爷用一些奇怪的方法切掉了这道题%%%%% 这里用的是大众方法——动态规划. 其实这是一道类似于二进制数位dp的动态规划题,(但是实际 ...

随机推荐

  1. PHP生成QRCode二维码

    php生成QRCode二维码示例 <?php //引入 phpqrcode 类库 //phpqrcode下载地址:https://github.com/t0k4rt/phpqrcode //或从 ...

  2. 初识 tk.mybatis.mapper 通用mapper

    在博客园发表Mybatis Dynamic Query后,一位园友问我知不知道通用mapper,仔细去找了一下,还真的有啊,比较好的就是abel533写的tk.mybatis.mapper. 本次例子 ...

  3. 分布式监控系统Zabbix-3.0.3-完整安装记录(1)

    分布式监控系统Zabbix-3.0.3的安装记录 环境说明zabbix-server:192.168.1.30     #zabbix的服务端(若要监控本机,则需要配置本机的Zabbix agent, ...

  4. springboot undertow替换tomcat方式

    版权声明: https://blog.csdn.net/weixin_38187317/article/details/81532560说明        undertow,jetty和tomcat可 ...

  5. Opentsdb 启动显示配置文件不存在

    今天 重新启动opentsdb  出现本地配置文件不存在   这不知道  我查了一下官网 了解到 You can use the --config command line argument to s ...

  6. Leetcode——258.各位相加【水题】

    给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数. 示例: 输入: 38 输出: 2 解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2. 由于 2 是一位数,所 ...

  7. TortoiseSvn/Git的WaterEffect

    https://github.com/TortoiseGit/TortoiseGit/blob/master/src/Utils/MiscUI/WaterEffect.cpp C#的实现: http: ...

  8. [转帖] infiniband的协议速度

  9. [日常工作]Oracle新增数据文件的小知识点

    1. 表空间是small file tablespace的 然后数据文件长到了32g左右之后无法再次扩充, 应用报错了 为了性能和最快的处理 使用语句 alter tablespace user ad ...

  10. 让 VAGRANT 启动并运行起来

    这是一个帮助你快速入门Vagrant的初级教程.官方文档也可以很好的帮助你入门,但是本文更针对完全零基础的初学者并且会对某些问题直接切入正题. 本文在任何方面都不会取代官方文档,而且我建议读完本文的人 ...