hdu5803
hdu5803
题意
给出四个整数 A B C D,问有多少个四元组 (a, b, c, d) 使 a + c > b + d 且 a + d >= b + c ,0 <= a <= A ,0 <= b <= B,0 <= c <= C,0 <= d <= D .
分析
可以用数位dp解决这个问题。
同时对四个数进行数位dp,采用记忆化搜索的形式,搜索过程中考虑剪枝,考虑到百位数时,如果 a + c - b - d >= 2,那么到十位数时(a + c - b - d 最少也才 -18,而前面到十位数会乘 10 即得到 20)一定满足条件了(加上 a + d - b - c 同理),而 a + c - b - d <= -2 那么到十位数时无论如何都不会满足条件了,可以直接剪枝。
但是每次要有 10 * 10 * 10 * 10 的状态转移,还要考虑优化,将四个数转化成二进制数,再进行 dp,前面的剪枝仍然可用。
code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll MOD = 1e9 + 7;
int bit[5][65];
ll dp[62][5][5][16];
ll dfs(int l, int acbd, int adbc, int limit)
{
if(l < 0) return acbd > 0 && adbc >= 0;
ll& res = dp[l][acbd + 2][adbc + 2][limit];
if(res != -1) return res;
res = 0;
int up[4];
for(int i = 0; i < 4; i++)
{
up[i] = (limit >> i & 1) ? bit[i][l] : 1;
}
for(int a = 0; a <= up[0]; a++)
{
for(int b = 0; b <= up[1]; b++)
{
for(int c = 0; c <= up[2]; c++)
{
for(int d = 0; d <= up[3]; d++)
{
int acbd_ = acbd, adbc_ = adbc, limit_ = 0;
acbd_ = min(acbd_ * 2 + a + c - b - d, 2);
adbc_ = min(adbc_ * 2 + a + d - b - c, 2);
if(acbd_ <= -2 || adbc_ <= -2) continue;
if(a == up[0] && (limit & 1)) limit_ |= 1;
if(b == up[1] && (limit >> 1 & 1)) limit_ |= 2;
if(c == up[2] && (limit >> 2 & 1)) limit_ |= 4;
if(d == up[3] && (limit >> 3 & 1)) limit_ |= 8;
(res += dfs(l - 1, acbd_, adbc_, limit_)) %= MOD;
}
}
}
}
return res;
}
int main()
{
int T;
for(scanf("%d", &T); T--;)
{
memset(bit, 0, sizeof bit);
memset(dp, -1, sizeof dp);
ll A, B, C, D;
scanf("%lld%lld%lld%lld", &A, &B, &C, &D);
for(int i = 0; i < 62; i++)
{
bit[0][i] = A >> i & 1;
bit[1][i] = B >> i & 1;
bit[2][i] = C >> i & 1;
bit[3][i] = D >> i & 1;
}
printf("%lld\n", dfs(60, 0, 0, 15));
}
return 0;
}
hdu5803的更多相关文章
随机推荐
- ZOJ 3195 Design the city 题解
这个题目大意是: 有N个城市,编号为0~N-1,给定N-1条无向带权边,Q个询问,每个询问求三个城市连起来的最小权值. 多组数据 每组数据 1 < N < 50000 1 < Q ...
- webapp 1px显示两倍的问题
公司最近换新首页,按照设计师的要求<大家都在逛>的分割线要1个像素. .span-3{ width:33.3333%; &:not(:first-child){ &:bef ...
- 一个全局变量引起的DLL崩溃
参考我发的帖子: http://bbs.csdn.net/topics/390737064?page=1#post-397000946 现象是exe程序在加载dll的时候崩溃了,莫名其妙的崩溃了.换其 ...
- Maven的下载,安装,配置,测试,初识
1:Maven官网:http://maven.apache.org/ Maven远程仓库:http://search.maven.org/ 2:Maven是一个采用纯Java编写的开源项目管理工具,M ...
- C语言学习第九章
学习C语言的最后一节课了,原因嘛上一章的末尾说过了,其实写这篇博客的时候以后开始学习Java一个多月了,一直因为各种各样的原因没有坚持做到每天一篇学习记录,可能主要因为懒吧....也有点笨,Java的 ...
- 第一次在gitHub上传项目到git.oschina的方法
首先在Git@osChina创建一个项目仓库 1.创建sshKey公钥 ssh-keygen -t rsa -C "ty635725964@qq.com" 之后连续三个空格,默认无 ...
- 在Delphi下使用迅雷APlayer组件进行免注册开发
之前都是用的delphi下的dspack进行的视频开发,这个组件其实很好用,就是找解码器麻烦点,而且还得在客户的计算机上使用RegSvr32.exe也注册解码器,要不有可能播放不了. 结果在查找合适的 ...
- DirectFB 之 分段动画
动画动态配置 一套素材的目录结构一般如下: 子目录中的图片名称都是以数字命名,比如,1,2, 3, 4,-- 而配置文件animation.cfg的格式如下: #width height ...
- 基于header的一些常用指令详解
header常用指令 header分为三部分: 第一部分为HTTP协议的版本(HTTP-Version): 第二部分为状态代码(Status): 第三部分为原因短语(Reason-Phrase) ...
- Scrapy 爬虫框架入门案例详解
欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:崔庆才 Scrapy入门 本篇会通过介绍一个简单的项目,走一遍Scrapy抓取流程,通过这个过程,可以对 ...