HDU 4588 Count The Carries 数位DP || 打表找规律
2013年南京邀请赛的铜牌题。。。做的非常是伤心。另外有两个不太好想到的地方。。
。。a 能够等于零,另外a到b的累加和比較大。大约在2^70左右。
首先说一下解题思路。
首先统计出每一位的1的个数,然后统一进位。
设最低位为1。次低位为2,依次类推,ans[]表示这一位上有多少个1。那么有
sum += ans[i]/2,ans[i+1] += ans[i]/2;
sum即为答案。
好了,如今问题转化成怎么求ans[]了。
打表查规律比較奇妙,上图不说话。
打表的代码
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <cmath>
#include <stack>
#include <map> #pragma comment(linker, "/STACK:1024000000");
#define EPS (1e-8)
#define LL long long
#define ULL unsigned long long
#define _LL __int64
#define _INF 0x3f3f3f3f
#define Mod 9999991
#define lowbit(x) (x&(-x)) using namespace std; void out(int x)
{
while(x)
{
printf("%d",x&1);
x >>= 1;
}
} int main()
{
for(int i = 1;i <= 100; ++i)
{
printf("i = %3d : ",i);
out(i);
puts("");
} return 0;
}
好了。重头戏来了。这个数位DP做的还是非常有成就感的。
记忆化搜索 + bfs推送
昨天事实上想这个思路了。
。
。
只是当时比較着急没写出来,心态是个非常重要的东西。
记忆化搜索部分dp[sta][site][dig] 第一维表示是否到达上限,site表示第几位,dig表示是1还是0。
那么site == 1时,也就是说最高位记录的信息是正确的。可是其它的就不是想要的了。
由于dp[sta][site][sta] 表示当前位到最低位的方案数。
所以说要把最高位的答案推送下去。
推送非常easy,每种状态最多仅仅会由两种子状态得到,所以按比例推送一下即可了。
详见代码。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <cmath>
#include <stack>
#include <map> #pragma comment(linker, "/STACK:1024000000");
#define EPS (1e-8)
#define LL long long
#define ULL unsigned long long
#define _LL __int64
#define _INF 0x3f3f3f3f
#define Mod 9999991
#define lowbit(x) (x&(-x)) using namespace std; _LL dp[2][105][2],dp1[2][105][2]; _LL up[105]; _LL ansa[105],ansb[105]; _LL dfs(_LL sta,_LL site,_LL dig)
{
if(dp[sta][site][dig] != -1)
return dp[sta][site][dig];
if(site == 100)
{
dp[sta][site][dig] = 1;
return 1;
} dp[sta][site][dig] = 0; if(sta == 0)
{
dp[sta][site][dig] = dfs(0,site+1,0) + dfs(0,site+1,1);
}
else
{
if(up[site+1] == 1)
{
dp[sta][site][dig] = dfs(1,site+1,1) + dfs(0,site+1,0);
}
else
{
dp[sta][site][dig] = dfs(1,site+1,0);
}
}
return dp[sta][site][dig];
} void Cal(_LL x,_LL *ans)
{
_LL temp = x,len = 100; memset(ans,0,sizeof(_LL)*(102)); if(x == 0)
return ;
while(temp)
{
up[len--] = temp%2;
temp /= 2;
} len++;
memset(dp,-1,sizeof(dp));
dfs(1,len,1);
dfs(0,len,0);
_LL i; memset(dp1,0,sizeof(dp1)); dp1[1][len][1] = max((_LL)0,dp[1][len][1]);
dp1[1][len][0] = max((_LL)0,dp[1][len][0]);
dp1[0][len][1] = max((_LL)0,dp[0][len][1]);
dp1[0][len][0] = max((_LL)0,dp[0][len][0]); for(_LL site = len;site <= 99; ++site)
{
dp1[0][site+1][1] += dp1[0][site][1]*dp[0][site+1][1]/(dp[0][site+1][1] + dp[0][site+1][0]);
dp1[0][site+1][1] += dp1[0][site][0]*dp[0][site+1][1]/(dp[0][site+1][1] + dp[0][site+1][0]);
dp1[0][site+1][0] += dp1[0][site][1]*dp[0][site+1][0]/(dp[0][site+1][1] + dp[0][site+1][0]);
dp1[0][site+1][0] += dp1[0][site][0]*dp[0][site+1][0]/(dp[0][site+1][1] + dp[0][site+1][0]); if(up[site+1] == 1)
{
if(up[site] == 1)
{
dp1[1][site+1][1] += dp1[1][site][1]*dp[1][site+1][1]/(dp[1][site+1][1] + dp[0][site+1][0]);
dp1[0][site+1][0] += dp1[1][site][1]*dp[0][site+1][0]/(dp[1][site+1][1] + dp[0][site+1][0]);
}
else
{
dp1[1][site+1][1] += dp1[1][site][0]*dp[1][site+1][1]/(dp[1][site+1][1] + dp[0][site+1][0]);
dp1[0][site+1][0] += dp1[1][site][0]*dp[0][site+1][0]/(dp[1][site+1][1] + dp[0][site+1][0]);
}
}
else
{
dp1[1][site+1][0] = dp1[1][site][0] + dp1[1][site][1];
}
} for(i = len;i <= 100; ++i)
{
ans[i] = max((_LL)0,dp1[1][i][1]) + max((_LL)0,dp1[0][i][1]);
}
} int main()
{
_LL a,b,i; while(scanf("%I64d %I64d",&a,&b) != EOF)
{
Cal(b,ansb);
Cal(max((_LL)0,a-1),ansa); _LL sum = 0; for(i = 100;i >= 1; --i)
{
sum += (ansb[i]-ansa[i])/2;
ansb[i-1] += (ansb[i]-ansa[i])/2;
}
printf("%I64d\n",sum);
} return 0;
}
HDU 4588 Count The Carries 数位DP || 打表找规律的更多相关文章
- HDU 5753 Permutation Bo (推导 or 打表找规律)
Permutation Bo 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5753 Description There are two sequen ...
- HDU 5795 A Simple Nim(SG打表找规律)
SG打表找规律 HDU 5795 题目连接 #include<iostream> #include<cstdio> #include<cmath> #include ...
- HDU 4588 Count The Carries 数学
Count The CarriesTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/ ...
- HDU 4588 Count The Carries 计算二进制进位总数
点击打开链接 Count The Carries Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java ...
- HDU 5795 A Simple Nim (博弈 打表找规律)
A Simple Nim 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5795 Description Two players take turns ...
- HDU 4588 Count The Carries(数学统计)
Description One day, Implus gets interested in binary addition and binary carry. He will transfer al ...
- HDU 4588 Count The Carries(找规律,模拟)
题目 大意: 求二进制的a加到b的进位数. 思路: 列出前几个2进制,找规律模拟. #include <stdio.h> #include <iostream> #includ ...
- HDU 4588 Count The Carries (数学,计数)
题意:给定两个十进制数,求二进制中,从x加到y的二进制进了多少位. 析:把这些数字的二进制纵向罗列出来,然后一位一位的把和加起来,最终得到总的进位数.从1到x,第i位上1的总数是x左移i+1位再右移i ...
- hdu 4588 Count The Carries
思路:容易发现二进制表示的数的最低位规律是01010101……:接着是001100110011……:接着是:0000111100001111…… 这样我们发现每一位的循环节是2^(i+1),前2^i是 ...
随机推荐
- angularjs 工具方法
<!DOCTYPE HTML> <html ng-app> <head> <meta http-equiv="Content-Type" ...
- [USACO09JAN] 气象测量/气象牛The Baric Bovine 解题报告(DP)
题目链接:https://www.luogu.org/problemnew/show/P2933 Description 为了研究农场的气候,Betsy帮助农夫John做了N(1 <= N &l ...
- CURRENMONTH TAG in Automation Framework
/** * @param input * <CURRENTMONTH><CURRENTMONTH+1> * @return Month "MM" */ pr ...
- 《剑指offer》字符串中的字符替换
一.题目描述 请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 二.输入描 ...
- JS中的switch case
function GetDepartmentName(type) { switch (type) { case DepartMentQian: alert($('#DepartMentQian').v ...
- php 扩展模块安装过程
安装php模块,不需要重新编译php,可以动态扩展php模块. 以安装msgpack模块为例:(此处php5.6是编译安装的) 1.下载msgpack模块源码包 # wget http://pecl. ...
- 深入理解 sudo 与 su 之间的区别
深入理解 sudo 与 su 之间的区别 作者: Himanshu Arora 译者: LCTT zhb127 在早前的一篇文章中,我们深入讨论了 sudo 命令的相关内容.同时,在该文章的末尾有提到 ...
- 在windows下如何新建爬虫虚拟环境和进行scrapy安装
Scrapy是Python开发的一个快速.高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改.Sc ...
- SSD-tensorflow-1 demo
一.简易识别 用最简单的已训练好的模型对20类目标做检测. 你电脑的tensorflow + CUDA + CUDNN环境都是OK的, 同时python需要安装cv2库 { 'aeropla ...
- NodeJS学习笔记 进阶 (12)Nodejs进阶:crypto模块之理论篇
个人总结:读完这篇文章需要30分钟,这篇文章讲解了使用Node处理加密算法的基础. 摘选自网络 Nodejs进阶:crypto模块之理论篇 一. 文章概述 互联网时代,网络上的数据量每天都在以惊人的速 ...