BZOJ

洛谷

切了一道简单的数位DP,终于有些没白做题的感觉了...(然而mjt更强没做过这类的题也切了orz)


看部分分,如果\(k=0\),就是求\(\sum_{i=0}^n\sum_{j=0}^mi\ \mathbb{xor}\ j\)。这个数据范围考虑数位DP。(其实统计一下\(\leq n\)和\(\leq m\)中每位为\(1\)的数有多少个就行了...)

如果你做过字节跳动冬令营网络赛 D.The Easiest One(没做过也行),就可以想到枚举每一位的时候,同时枚举\(x,y\)这一位选啥,处理一下贡献就行了。

对于\(k\)的限制,同样对\(k\)二进制分解,转移时判一下如果当前\(<k\)时continue就行了...

看代码很好理解...

貌似有很神的代码...见洛谷rank1=-=


//828kb	1532ms
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define mp std::make_pair
#define pr std::pair<int,int>
#define gc() getchar()
typedef long long LL;
const int N=66,INF=1e9+7; int P,bitx[N],bity[N],bitk[N];
LL pw[N];
pr f[N][8];
bool vis[N][8]; inline LL read()
{
LL now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now;
}
pr DFS(int x,int s)//pair(和,方案数)
{//0:==k 1:>k
if(x==-1) return mp(0,1);
if(vis[x][s]) return f[x][s];
int upx=s&1?bitx[x]:1, upy=s&2?bity[x]:1, sk=s&4;
LL f1=0,f2=0;
for(int i=0; i<=upx; ++i)
for(int j=0; j<=upy; ++j)
{
int val=(i^j)-bitk[x];
if(!sk && val<0) continue;
pr v=DFS(x-1,(s&1&&i==upx)|((s&2&&j==upy)<<1)|((sk||val>0)<<2));
if(val) f1+=val*pw[x]*v.second%P;
f1+=v.first, f2+=v.second;
}
return vis[x][s]=1,f[x][s]=mp((f1%P+P)%P,f2%P);
}
void Calc(LL x,LL y,LL k)
{
memset(vis,0,sizeof vis);
memset(bitx,0,sizeof bitx);
memset(bity,0,sizeof bity);
memset(bitk,0,sizeof bitk);
int t1=0,t2=0,t3=0;
for(; x; x>>=1) bitx[t1++]=x&1;
for(; y; y>>=1) bity[t2++]=y&1;
for(; k; k>>=1) bitk[t3++]=k&1;
printf("%d\n",DFS(std::max(t1,std::max(t2,t3))-1,3).first);
} int main()
{
freopen("table.in","r",stdin);
freopen("table.out","w",stdout); for(int T=read(); T--; )
{
LL n=read()-1,m=read()-1,K=read(); int P=read(); ::P=P;
for(int i=0; i<63; ++i) pw[i]=(1ll<<i)%P;
Calc(n,m,K);
} return 0;
}

BZOJ.4513.[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. 4513: [Sdoi2016]储能表 数位DP

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

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

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

  4. bzoj 4513 [Sdoi2016]储能表

    题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4513 题解 要求的式子 用数位dp的方法去做 我们把式子拆开 变成 $\sum_{i=0}^ ...

  5. [SDOI2016]储能表——数位DP

    挺隐蔽的数位DP.少见 其实减到0不减了挺难处理.....然后就懵了. 其实换个思路: xor小于k的哪些都没了, 只要留下(i^j)大于等于k的那些数的和以及个数, 和-个数*k就是答案 数位DP即 ...

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

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

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

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

  8. 4513: [Sdoi2016]储能表

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

  9. 搜索(四分树):BZOJ 4513 [SDOI2016 Round1] 储能表

    4513: [Sdoi2016]储能表 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 395  Solved: 213[Submit][Status] ...

随机推荐

  1. jacoco + eclipse单元测试覆盖率

    概念 Jacoco:JaCoCo是一个开源的覆盖率工具,它针对的开发语言是java,其使用方法很灵活,可以嵌入到Ant.Maven中:可以作为Eclipse插件,可以使用其JavaAgent技术监控J ...

  2. selenium+python-autoit文件上传

    前言 关于非input文件上传,点上传按钮后,这个弹出的windows的控件了,已经跳出三界之外了,不属于selenium的管辖范围(selenium不是万能的,只能操作web上元素).autoit工 ...

  3. bat 获取拖放文件路径或名称

    获取路径: @echo offset path=%~dp1echo %path%pause 获取路径及名称: @echo offset path=%~dp1%~nx1echo %path%pause

  4. unicode解码

    var newStr = System.Text.RegularExpressions.Regex.Unescape(str);

  5. Beyond-Compare 4 -linux 破解

    key失效了可以去https://www.serials.be/serial/Beyond_Compare_4_Linux_68803632.html生成 Crack-Beyond-Compare-l ...

  6. 挂在光盘出现写保护mount: block device /dev/sr0 is write-protected, mounting read-only

    https://blog.csdn.net/yueludanfeng/article/details/60339688

  7. Java基础知识➣多线程编程(五)

    概述 Java 给多线程编程提供了内置的支持.一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径.使用多线程也是为了充分的利用服务器资源, ...

  8. php让一个数组按照另外一个数组的键名进行排序

    $a = [ 'id', 'name', 'identityId', 'phone', 'email', 'schoolId' ]; $b = [ 'id' => '唯一标识', 'identi ...

  9. error: Unable to find vcvarsall.bat

    http://www.crifan.com/python_mmseg_error_unable_to_find_vcvarsall_bat/ [已解决]安装Python模块mmseg出错:error: ...

  10. python基础——list和tuple(列表和元组)

    1.list的定义,插入insert,append,按位置索引. >>> name = ['Macal','lily','lucy','bob']  --初始化>>> ...