/*
题意:
给你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. 【转】关于PHP的header("P3P: CP=CURa……")

    对于IE来说(默认安全级别下),iframe.img.link等标签都是只发送session cookie(又叫 第一方cookie),拦截本地cookie发送(又叫第三方cookie).当这些标签跨 ...

  2. Asianux3配置yum

    把下面四个文件放到/etc/yum.repos.d目录下 dag.repo: [dag] name=Dag RPM Repository for RHEL5 baseurl=http://mirror ...

  3. 每天一个linux命令-转载

    每天一个linux命令目录 转载自: http://www.cnblogs.com/peida/archive/2012/12/05/2803591.html   开始详细系统的学习linux常用命令 ...

  4. spring 中事务的PROPAGATION_REQUIRED,Readonly的解释

                 一.事务传播行为种类 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为, 它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播 ...

  5. Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法

    Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法 昨天在开发的时候遇到个小问题,就是如何将Grid的内容与Form一起发送到服务器端.默认情况下,表单(F ...

  6. Hibernate 抓取策略fetch-1 (select join subselect)

    原文 :http://4045060.blog.51cto.com/4035060/1088025 部分参考:http://www.cnblogs.com/rongxh7/archive/2010/0 ...

  7. C#Winfrom系统打印机调用/设置默认打印机

    实现如下效果: 实现方式如下: using System;using System.Drawing.Printing;using System.Runtime.InteropServices;usin ...

  8. 报错:java.lang.IllegalStateException: Cannot call sendError() after the response has been committed(待解答)

    严重: Servlet.service() for servlet [default] in context with path [/20161101-struts2-1] threw excepti ...

  9. 兼容所有浏览器---无缝上下左右交叉运动----原生js+css

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  10. 如何实现一个malloc

    任何一个用过或学过C的人对malloc都不会陌生.大家都知道malloc可以分配一段连续的内存空间,并且在不再使用时可以通过free释放掉.但是,许多程序员对malloc背后的事情并不熟悉,许多人甚至 ...