/*
题意:
给你l和r,范围9e18,求l到r闭区间有多少个数字满足,连续的奇数的个数都为偶数,连续的偶数的个数都为奇数。
例如33433符合要求,44不符合要求。不能含有前导零。 思路:
队友说是数位dp...我都反映不过来。
知道是数位dp以后,思路就显而易见了。
dp的方法是最后一位的性质,是偶数还是奇数,是连续的第偶数个还是第奇数个。所以一共只有四种状态,而题目中最多19位数字...
用了以上的方法,我们可以轻易解决有n为数字的符合要求的数字的个数。
问题是如何考虑边界条件。
所以我们可以先判断l和r有多少位。然后提前打表,中间的位数直接加到答案上来就好。
现在我们讨论跟l和r位数相同的在l到r范围内的,即大于等于l,小于等于r的个数。
假如l和r位数相同,那么我们可以用小于等于r的减去小于等于l的,然后特判l是不是。
位数不同,可以直接求和l位数相同的,大于等于l的加上和r位数相同的小于等于r的。
所以现在问题转化为,位数确定的情况下,小于等于或者大于等于某个数的符合条件数的个数有多少。
类似dfs,依次讨论前几位大于等于某位或者小于等于某位有多少个...(这个大概是数位dp的核心?)
【简单说一下,第i次统计的数目是,假如第i位大于边界值,而前i-1位等于边界值的符合要求的数字的数目,这样一直统计到i+1...】
*/ #include<bits/stdc++.h>
using namespace std;
bool panduan(unsigned long long num)
{
int curr=;
int len=;
while(num)
{
int temp=num%;
if(curr==)
{
if(temp%)
curr=;
else curr=;
len=;
}
else
{
if(curr==)
{
if(temp%)
len++;
else
{
if(len%)
return false;
len=;
curr=;
}
}
else
{
if(temp%==)
len++;
else
{
if(len%==)
return false;
len=;
curr=;
}
}
}
num/=;
}
if((curr==)&&(len%==))
return true;
if((curr==)&&(len%==))
return true;
return false;
}
int get_wei(unsigned long long t){
int rel=;
while(t>){
rel++;
t/=;
}
return rel;
}
unsigned long long dp[][];
unsigned long long biao[];
void dabiao(){
for(int i=;i<=;i++){
memset(dp,,sizeof(dp));
for(int j=;j<=i;j++){
if(j==){
dp[j][]+=;
dp[j][]+=;
}
dp[j][]+=(dp[j-][]+dp[j-][])*;
dp[j][]+=dp[j-][]*;
dp[j][]+=(dp[j-][]+dp[j-][])*;
dp[j][]+=dp[j-][]*;
}
biao[i]=dp[i][]+dp[i][];
}
}
int fenjie[];
unsigned long long dayudengyu(unsigned long long l){
unsigned long long rel=;
unsigned long long ll=l;
int num=;
while(ll>){
fenjie[num++]=ll%;
ll/=;
}
for(int i=;i<num/;i++){
swap(fenjie[i],fenjie[num-i-]);
}
memset(dp,,sizeof(dp));
for(int i=;i<num;i++){
for(int j=i;j<num;j++){
if(j==i){
if(fenjie[i]&){
if(j==){
dp[j][]=dp[j][]=(-fenjie[i])/;
}
else{
int ttt=(-fenjie[i])/;
dp[j][]=(dp[j-][]+dp[j-][])*ttt;
dp[j][]=dp[j-][]*ttt;
dp[j][]=(dp[j-][]+dp[j-][])*ttt;
dp[j][]=dp[j-][]*ttt;
}
}
else{
if(j==){
dp[j][]=(-fenjie[i])/-;
dp[j][]=(-fenjie[i])/;
}
else{
int ttt=(-fenjie[i])/;
dp[j][]=(dp[j-][]+dp[j-][])*(ttt-);
dp[j][]=dp[j-][]*(ttt-);
dp[j][]=(dp[j-][]+dp[j-][])*ttt;
dp[j][]=dp[j-][]*ttt;
}
}
}
else{
dp[j][]=(dp[j-][]+dp[j-][])*;
dp[j][]=dp[j-][]*;
dp[j][]=(dp[j-][]+dp[j-][])*;
dp[j][]=dp[j-][]*;
}
}
rel+=dp[num-][]+dp[num-][];
memset(dp,,sizeof(dp));
for(int j=;j<=i;j++){
if(j==){
if(fenjie[j]&)dp[j][]=;
else dp[j][]=;
}
else{
if(fenjie[j]&){
dp[j][]=(dp[j-][]+dp[j-][]);
dp[j][]=dp[j-][];
}
else{
dp[j][]=(dp[j-][]+dp[j-][]);
dp[j][]=dp[j-][];
}
}
}
}
return rel+dp[num-][]+dp[num-][];
}
unsigned long long xiaoyudengyu(unsigned long long l){
unsigned long long rel=;
unsigned long long ll=l;
int num=;
while(ll>){
fenjie[num++]=ll%;
ll/=;
}
for(int i=;i<num/;i++){
swap(fenjie[i],fenjie[num-i-]);
}
memset(dp,,sizeof(dp));
for(int i=;i<num;i++){
for(int j=i;j<num;j++){
if(j==i){
if(fenjie[i]&){
if(j==){
dp[j][]=fenjie[i]/;
dp[j][]=fenjie[i]/;
}
else{
unsigned long long ttt=(fenjie[i])/+;
unsigned long long tt=fenjie[i]/;
dp[j][]=(dp[j-][]+dp[j-][])*ttt;
dp[j][]=dp[j-][]*ttt;
dp[j][]=(dp[j-][]+dp[j-][])*tt;
dp[j][]=dp[j-][]*tt;
}
}
else{
if(j==){
dp[j][]=max(fenjie[i]/-,);
dp[j][]=(fenjie[i])/;
}
else{
int ttt=max(,fenjie[i]/);
int tt=fenjie[i]/;
dp[j][]=(dp[j-][]+dp[j-][])*(ttt);
dp[j][]=dp[j-][]*(ttt);
dp[j][]=(dp[j-][]+dp[j-][])*(tt);
dp[j][]=dp[j-][]*tt;
}
}
}
else{
dp[j][]=(dp[j-][]+dp[j-][])*;
dp[j][]=dp[j-][]*;
dp[j][]=(dp[j-][]+dp[j-][])*;
dp[j][]=dp[j-][]*;
}
}
rel+=dp[num-][]+dp[num-][];
//cout << rel << endl;
memset(dp,,sizeof(dp));
for(int j=;j<=i;j++){
if(j==){
if(fenjie[j]&)dp[j][]=;
else dp[j][]=;
}
else{
if(fenjie[j]&){
dp[j][]=(dp[j-][]+dp[j-][]);
dp[j][]=dp[j-][];
}
else{
dp[j][]=(dp[j-][]+dp[j-][]);
dp[j][]=dp[j-][];
}
}
}
}
return rel+dp[num-][]+dp[num-][];
}
int main(){
int a;
dabiao();
int cas=;
scanf("%d",&a); while(a--){
cas++;
unsigned long long l,r,ll,rr;
unsigned long long rel=;
scanf("%llu%llu",&l,&r);
int st=get_wei(l);
int ed=get_wei(r);
for(int i=st+;i<ed;i++){
rel+=biao[i];
}
if(st==ed){
rel+=xiaoyudengyu(r);
rel+=panduan(l);
rel-=xiaoyudengyu(l);
}
else{
rel+=dayudengyu(l);
rel+=xiaoyudengyu(r);
}
printf("Case #%d: ",cas);
printf("%llu\n",rel);
} }

HDU 5808[数位dp]的更多相关文章

  1. hdu 4507 数位dp(求和,求平方和)

    http://acm.hdu.edu.cn/showproblem.php?pid=4507 Problem Description 单身! 依旧单身! 吉哥依旧单身! DS级码农吉哥依旧单身! 所以 ...

  2. hdu 4352 数位dp + 状态压缩

    XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. 2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6156 数位DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6156 题意:如题. 解法:数位DP,暴力枚举进制之后,就转化成了求L,R区间的回文数的个数,这个直接做 ...

  4. hdu:2089 ( 数位dp入门+模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 数位dp的模板题,统计一个区间内不含62的数字个数和不含4的数字个数,直接拿数位dp的板子敲就行 ...

  5. HDU 4352 XHXJ's LIS HDU(数位DP)

    HDU 4352 XHXJ's LIS HDU 题目大意 给你L到R区间,和一个数字K,然后让你求L到R区间之内满足最长上升子序列长度为K的数字有多少个 solution 简洁明了的题意总是让人无从下 ...

  6. hdu 3709 数位dp

    数位dp,有了进一步的了解,模板也可以优化一下了 题意:找出区间内平衡数的个数,所谓的平衡数,就是以这个数字的某一位为支点,另外两边的数字大小乘以力矩之和相等,即为平衡数例如4139,以3为支点4*2 ...

  7. HDU 2089 数位dp入门

    开始学习数位dp...一道昨天看过代码思想的题今天打了近两个小时..最后还是看了别人的代码找bug...(丢丢) 传说院赛要取消 ? ... 这么菜不出去丢人也好吧~ #include<stdi ...

  8. HDU 2089 数位dp/字符串处理 两种方法

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  9. HDU 3652(数位DP)

    题目链接:B-number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

随机推荐

  1. LINUX系统下PHP显示空白页

    因为手工转移,文件所属用户及用户组是root,所以需要把网站程序及数据库都改成对应用户组:如www和mysql. 更改目录所属用户执行命令: chown -R 用户.用户组 目录名, 如:chown ...

  2. Microsoft Dynamics CRM2011 必备知识点

    一.CRM基本知识 1.CRM2001 有几个服务端点? 答:对外公开的服务,如Web服务,WCF,Restful API 2.一个ERP系统,要访问CRM的数据,CRM2011有哪些现有的服务入口提 ...

  3. mysql的text的类型注意

    不要以为text就只有一种类型! Text也分为四种类型:TINYTEXT.TEXT.MEDIUMTEXT和LONGTEXT 其中 TINYTEXT 256 bytes TEXT 65,535 byt ...

  4. 通过批处理文件启动oracle11g服务

    注:ORCL是数据库实例名,默认的数据库是ORCL,你可以创建其他的,即OracleService+数据库名. ========================================启动服务 ...

  5. nginx ssi 配置小细节(一)

    最近工作需要使用nginx的ssi (server side include)技术,在这里,将使用中的一点心得分享一下,也是一种备忘! 首先,nginx的ssi启用很简单,就只有三个最基本的指令: s ...

  6. HttpSessionBindingListener和HttpSessionAttributeListener区别 - gengkunpeng的专栏 - 博客频道 - CSDN.NET

    分享到 一键分享 QQ空间 新浪微博 百度云收藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 HttpSession ...

  7. 【转】8张图理解Java

    一图胜千言,下面图解均来自Program Creek 网站的Java教程,目前它们拥有最多的票选.如果图解没有阐明问题,那么你可以借助它的标题来一窥究竟. 1.字符串不变性 下面这张图展示了这段代码做 ...

  8. IntelliJ IDEA添加过滤文件或目录

    Settings→Editor→File Types 在下方的忽略文件和目录(Ignore files and folders)中添加自己需要过滤的内容 下图为我自己添加过滤的内容,例如:*.iml; ...

  9. FTP搭建

    在桌面上右击“我的电脑”,执行“管理”命令,在“计算机管理”窗口的左窗格中依次展开“系统工具 ”→“本地用户和组”目录,单击选中“用户”选项.在右侧窗格中单击右键,执行“新用户”命令.在 打开的“新用 ...

  10. java工程师分享:我是如何自学成才的?

    原文:http://www.java800.com/peixun-79062115.html 我是10年河南工业大学的毕业生,当时我们专业许多学生都去报了java培训机构,去达内的都不少.我也想去培训 ...