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的更多相关文章
随机推荐
- JavaEE开发之SpringMVC中的路由配置及参数传递详解
在之前我们使用Swift的Perfect框架来开发服务端程序时,聊到了Perfect中的路由配置.而在SpringMVC中的路由配置与其也是大同小异的.说到路由,其实就是将URL映射到Java的具体类 ...
- 分享一本书<<谁都不敢欺负你>>
有些人,不管在工作还是生活上,总是被人欺负. 分享这本书给大家,能给大家带来正能量.你强大了,就没人敢欺负你. 有的时候,感到为什么倒霉的总是我?为什么我的命运是这样?为什么总欺负我? 也许有很多人会 ...
- python——面向对象进阶
类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的 ...
- python自动化测试应用-番外篇--接口测试2
篇2 book-python-auto-test-番外篇--接口测试2 --lamecho辣么丑 大家好! 我是lamecho(辣么丑),今天将继续上一篇python接 ...
- Java中双向链表的代码实现
写在前面: 双向链表是一种对称结构,它克服了单链表上指针单向性的缺点,其中每一个节点即可向前引用,也可向后引用,这样可以更方便的插入.删除数据元素. 由于双向链表需要同时维护两个方向的指针,因此添加节 ...
- <CentOS7>如何设置hostname
在CentOS/RHEL 7中,有个叫hostnamectl的命令行工具,它允许你查看或修改与主机名相关的配置: ceph@client-node ~]$ hostnamectlstatus Stat ...
- 【NLP】3000篇搜狐新闻语料数据预处理器的python实现
3000篇搜狐新闻语料数据预处理器的python实现 白宁超 2017年5月5日17:20:04 摘要: 关于自然语言处理模型训练亦或是数据挖掘.文本处理等等,均离不开数据清洗,数据预处理的工作.这里 ...
- css定位 浮动 伪类 margin
一,margin .标准文档流,margin在竖直方向的不叠加,以较大的为准 .使用margin: auto;的盒子必须有明确的width,并且只有标准文档流的盒子 才能使用margin: auto; ...
- angularjs ng-class
ng-class指令可以设置一个键值对,用于决定是否添加一个特定的类名,键为class名,值为bool类型表示是否添加该类名 <style> .red { color: red; } .g ...
- routeProvider路由的使用
先创建一个主程序文件index.html,内容如下: <!DOCTYPE html> <html ng-app="myApp"> <head> ...