$CF809C\ Find\ a\ car$ 数位$dp$
正解:数位$dp$
解题报告:
然后因为没有翻译所以先放个翻译$QAQ$
有一个无穷大的矩阵,第$i$行第$j$列的数是$(i-1)\ xor\ (j-1)+1$,有$q$次询问,每次询问一个矩形内$(x_{1},y_{1})(x_{2},y_{2})$小于等于$k$的数的和
好像是考试题,,,?学长出的$QwQ$?
然后考虑怎么做趴$QwQ$,发现这个式子其实要拆成两个部分?一个是$\sum (i-1)\ xor\ (j-1)$,一个是$\sum 1$,所以考虑拆成两个部分?一个为和一个为方案数$QwQ$
其实和与方案数的求法差不多,,,我就以和为$eg$港下怎么做嗷$QwQ$
其实是类似普通的数位$dp$的,设$f_{i,0/1,0/1,0/1}$表示考虑到第$i$位,$x$是否到达上限,$y$是否到达上限,$x\ xor\ y$是否到达上限.这么解释着可能有点儿空,,,,详细解释下$QwQ$
$f_{i,p,q,r}$,$i$表示二进制拆分后从高位到低位考虑到$x\ xor\ y$的第$i$位了,$p$表示二进制拆分后行号$x$是否是顶着$x_{1}$/$x_{2}$的,$q$表示二进制拆分后列号$y$是否是顶着$y_{1}$/$y_{2}$的,$r$表示二进制拆分后$x\ xor\ y$的值是否是顶着$k$的,然后转移下就好.这样解释下大概就能$get$了?发现其实和普通的数位$dp$也差不多,只不过平常的数位$dp$是十进制分解,这里因为涉及二进制运算所以就二进制分解掉了$QwQ$
然后转移也和普通的数位$dp$差不多?就如果顶着上线继续转移,否则随便搞
$over$?
对了这题不用$dfs$,直接$for$循环那种转移简洁明了$w$
恩留一个坑,就其实题目最开始给定的是说$(x,y)$这个格子的值是$mex_{i=1,j=1}^{x-1,y-1}dat_{i,j}$,但是因为我并不会证为什么它就等于$(x-1)\ xor\ (y-1)$,,,所以咕了$QwQ$
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define int long long
#define gc getchar()
#define ri register int
#define rb register int
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i) const int mod=1e9+,N=;
int K,f[N][][][],g[N][][][]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il int solv(ri x,ri y)
{
memset(f,,sizeof(f));memset(g,,sizeof(g));f[][][][]=;if(x< || y<)return ;
my(i,,)
rp(p,,)
rp(q,,)
rp(r,,)
if(f[i+][p][q][r])
rp(j,,)
rp(k,,)
{
if(!p && j && !(x&(<<i)))continue;
if(!q && k && !(y&(<<i)))continue;
if(!r && (j^k) && !(K&(<<i)))continue;
ri tmpp=p,tmpq=q,tmpr=r;
if(!j && (x&(<<i)))tmpp|=;
if(!k && (y&(<<i)))tmpq|=;
if(!(j^k) && (K&(<<i)))tmpr|=;
(f[i][tmpp][tmpq][tmpr]+=f[i+][p][q][r])%=mod;
(g[i][tmpp][tmpq][tmpr]+=g[i+][p][q][r])%=mod;
if(j^k)(g[i][tmpp][tmpq][tmpr]+=1ll*(<<i)*f[i+][p][q][r]%mod)%=mod;
}
ri ret=;rp(i,,)rp(j,,)rp(k,,)(ret+=g[][i][j][k])%=mod,(ret+=f[][i][j][k])%=mod;return ret;
} main()
{
//freopen("809c.in","r",stdin);freopen("809c.out","w",stdout);
ri T=read();
while(T--)
{
ri x_1=read()-,y_1=read()-,x_2=read()-,y_2=read()-;K=read()-;
printf("%d\n",(solv(x_2,y_2)+solv(x_1-,y_1-)+mod+mod-solv(x_2,y_1-)-solv(x_1-,y_2))%mod);
}
return ;
}
随机推荐
- Hbase架构与实现
- List of the best open source software applications
List of the best open source software applications by Ryan • Oct 25th, 2008 • Category: Featured Art ...
- 关于Java语言for循环内外变量定义的问题
今天看书时,看到一个代码,一个在循环外面没有用的变量,后即有了我的问题,在后面: 我的问题: 变量循环内定义,例如:while(true){String splitStr = null;}这“些”个s ...
- [Offer收割]编程练习赛108 - 树上的最短边 树链剖分
直接点权下放到边权,每次查询从dfs序的st[u]+1,ed[v]之间查询, #include<iostream> #include<stdio.h> #include< ...
- maven中如果使用本地jar
1.安装到本地仓库class12.jar这个东西在中央仓库里没有,所以,cmd到oracle\product\10.2.0\db_1\jdbc\lib路径下,mvn install 就好了(发布第三方 ...
- 最适合 Python 入门的资源有哪些?
https://blog.csdn.net/zV3e189oS5c0tSknrBCL/article/details/81230593 学习任何一门编程语言或者技能基本上都遵循3个步骤,第一步是看,第 ...
- 基于thinkphp实现根据用户ip判断地理位置并提供对应天气信息的应用
https://blog.csdn.net/MyCodeDream/article/details/46706469 我们都知道,在很多的网站都提供了给用户提供天气预报的功能,有时会发现,用户即使不输 ...
- 解析PHP跳出循环的方法以及continue、break、exit的区别介绍
本篇文章是对PHP跳出循环的方法以及continue.break.exit的区别进行了详细的分析介绍,需要的朋友参考下 PHP中的循环结构大致有for循环,while循环,do{} while 循 ...
- linux scull 代码write 方法
write, 象 read, 可以传送少于要求的数据, 根据返回值的下列规则: 如果值等于 count, 要求的字节数已被传送. 如果正值, 但是小于 count, 只有部分数据被传送. 程序最可能重 ...
- js实现小数点四舍五入
js实现小数点四舍五入 其实这个问题,在之前的面试中被提问到了,由于笔者平时都是用原生的toFixed()的方法来保留小数点,所以当时并没有回答出来这个问题,呜呜呜~.~