之前的文章已经讲过如何求1—r中的特殊数,这篇博客就来讲些进阶操作;

直接看例题(hdu2089):

(题目是中文的我就不写大意了)

这题与hdu3555最大的区别就是规定了l,不再以1开始;

解决这个问题也很简单,利用前缀和的思想,先计算1—l-1特殊数的数量,在计算l—r的数量,相减就是答案了;

附上丑陋的代码:

 #include<cstdio>
#include<iostream>
using namespace std;
#define int long long
const int MAXN=;
int n,r,t,digit[MAXN],dp[MAXN][MAXN],t2,l;
int dfs(int pos,int pre,bool limit)
{
if(pos==) return ;
if(!limit && dp[pos][pre] != )
{
return dp[pos][pre];
}
int up=;
if(limit) up=digit[pos];
int ans=;
for(int i=;i<=up;++i)
if(pre==&&i==||i==)
continue;
else
{
ans+=dfs(pos-,i,limit&&(i==digit[pos]));
}
if(!limit)
{
dp[pos][pre] = ans;
}
return ans;
}
void solve(int y,int x)
{
t=;
int xx=x;
while(x>)
{
++t;
digit[t]=x%;
x=x/;
}
int ans2=dfs(t,,);
t=;
--y;
xx=y;
while(y>)
{
++t;
digit[t]=y%;
y=y/;
}
int ans=dfs(t,,);
printf("%lld\n",ans2-ans);
}
main()
{
while(cin>>l>>r)
{
if(l==&&r==) return ;
solve(l,r);
}
}

例题2(hdu3652):

手(帮)动(你)翻译(太懒了,不想写题意)

这题又与上题有些不同,不仅要满足含13,还要整除13;

具体实现也不难,只要在搜索的同时记录数字除以13的余数;

怎么传递呢?这又要考小学奥数了,余数的性质;

()a与b的和除以c的余数(a、b两数除以c在没有余数的情况下除外),等于a,b分别除以c的余数之和(或这个和除以c的余数)。例如,,16除以5的余数分别是3和1,所以(+)除以5的余数等于3+=。注意:当余数之和大于除数时,所求余数等于余数之和再除以c的余数。例如,,19除以5的余数分别是3和4,所以(+)除以5的余数等于(+)除以5的余数。

()a与b的乘积除以c的余数,等于a,b分别除以c的余数之积(或这个积除以c的余数)。例如,,16除以5的余数分别是3和1,所以(×)除以5的余数等于3×=。注意:当余数之积大于除数时,所求余数等于余数之积再除以c的余数。例如,,19除以5的余数分别是3和4,所以(×)除以5的余数等于(×)除以5的余数。

性质()()都可以推广到多个自然数的情形。

太长不想看也不要紧,总结一下就是$a \times 100+b \times 10+c$ % $ d = a \times 100 $%$ d+b \times 10 $%$ d +c $%$ d$;

这有什么用呢,这个性质可以让我们在传递的时候,只要把余数$\times 10$再加上现在选取的数 mod 13就可以了,最后看是否满足条件

附上水代码:

 #include<cstdio>
#include<iostream>
using namespace std;
#define int long long
const int MAXN=;
int n,r,t,digit[MAXN],dp[MAXN][MAXN][MAXN][];
int dfs(int pos,int pre,bool limit,int mo,bool have,int sum)
{
if(pos==)
{
if(mo==&&have)
{
return ;
}
else
return ;
}
if(!limit&&dp[pos][pre][mo][have]!=) return dp[pos][pre][mo][have];
int up=;
if(limit) up=digit[pos];
int ans=;
for(int i=;i<=up;++i)
if(pre==&&i==)
ans+=dfs(pos-,i,limit&&(i==digit[pos]),(mo*+i)%,,sum*+i);
else
ans+=dfs(pos-,i,limit&&(i==digit[pos]),(mo*+i)%,have,sum*+i);
if(!limit) dp[pos][pre][mo][have]=ans;
return ans;
}
void solve(int x)
{
t=;
int xx=x;
while(x>)
{
++t;
digit[t]=x%;
x=x/;
}
printf("%lld\n",dfs(t,,,,,));
}
main()
{
while(cin>>r)
{
solve(r);
}
}

又这样水过了一篇博客;

数位dp进阶(hdu2089,3652)的更多相关文章

  1. 数位dp入门 hdu2089 不要62

    数位dp入门 hdu2089 不要62 题意: 给定一个区间[n,m] (0< n ≤ m<1000000),找出不含4和'62'的数的个数 (ps:开始以为直接暴力可以..貌似可以,但是 ...

  2. 华东交通大学 2019 I 不要666 数位dp进阶

    Problem Description 题库链接 666是一个网络用语,用来形容某人或某物很厉害很牛.而在西方,666指魔鬼,撒旦和灵魂,是不吉利的象征.所以邓志聪并不喜欢任何与6有关的数字.什么数字 ...

  3. 【数位DP】Hdu 3652:B-number

    B-number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  4. 【数位dp】hdu2089 不要62

    http://www.cnblogs.com/xiaohongmao/p/3473599.html #include<cstdio> using namespace std; int n, ...

  5. 数位DP学习笔记

    数位DP学习笔记 什么是数位DP? 数位DP比较经典的题目是在数字Li和Ri之间求有多少个满足X性质的数,显然对于所有的题目都可以这样得到一些暴力的分数 我们称之为朴素算法: for(int i=l_ ...

  6. HDU2089 不要62[数位DP]

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

  7. 【HDU 3652】 B-number (数位DP)

    B-number Problem Description A wqb-number, or B-number for short, is a non-negative integer whose de ...

  8. [您有新的未分配科技点]数位dp:从懵X到板子(例题:HDU2089 不要62)

    数位dp主要用来处理一系列需要数数的问题,一般套路为“求[l,r]区间内满足要求的数/数位的个数” 要求五花八门……比如“不出现某个数字序列”,“某种数的出现次数”等等…… 面对这种数数题,暴力的想法 ...

  9. Hdu 3652 B-number (同余数位DP)

    题目链接: Hdu 3652 B-number 题目描述: 给出一个数n,问 [1, n]区间内有几个数能被13整除并且还有13这个子串? 解题思路: 能整除的数位DP,确定好状态随便搞搞就能过了.d ...

随机推荐

  1. Django 自带 user 字段扩展及头像上传

    django 及 rest_framework 笔记链接如下: django 入门笔记:环境及项目搭建 django 入门笔记:数据模型 django 入门笔记:视图及模版 django 入门笔记:A ...

  2. Java课堂疑问解答与思考3

    一. 两对整数明明完全一样,为何一个输出true,一个输出false? 答: 整数在小于127时都可以用常量池,因此第一次比较的的地址是取自同一个地址的数字,而第二次比较的数是创建了两个不同地址的对象 ...

  3. sentos7网卡改名

    一.已经装好系统CentOS7修改网卡为eth0 1. 修改网卡配置文件[root@localhost ~]# mv /etc/sysconfig/network-scripts/ifcfg-ens3 ...

  4. Spark集成的包与引入包冲突

    今天在编写Spark应用的时候,想把处理结果输出为JSON字符串,查到Java比较常用的JSON处理包gson,按照其API编写代码后运行程序,总是出现"NoSuchMethodExcept ...

  5. [转帖]又一国产x86处理器可大规模上市:Intel至强核心 安全监测管控

    又一国产x86处理器可大规模上市:Intel至强核心 安全监测管控 https://www.cnbeta.com/articles/tech/850525.htm 不知道是不是有一起汉芯事件 国产CP ...

  6. [转帖]linux screen 命令详解,xshell关掉窗口或者断开连接,查看断开前执行的命令

    linux screen 命令详解,xshell关掉窗口或者断开连接,查看断开前执行的命令 https://binwaer.com/post/12.html yun install -y screen ...

  7. JZOJ2678 树B

    题 Description 已知无向连通图G由N个点,N-1条边组成.每条边的边权给定.现要求通过删除一些边,将节点1与另M个指定节点分开,希望删除的边的权值和尽量小,求此最小代价. Input 每个 ...

  8. [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块)

    [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块) 题面 求 \[\sum_{i=1}^{n} \sum_{j=1}^{m} \mathrm{lcm}(i,j)\] 分析 \[\su ...

  9. HNUSTOJ 1444:树的最长路径

    1444: 树的最长路径 时间限制: 1 Sec  内存限制: 128 MB 提交: 18  解决: 7 [提交][状态][讨论版] 题目描述 定义:无向树中结点的路径为该结点所能到达的最远距离:无向 ...

  10. MySQL: InnoDB的并发控制,锁,事务模型

    一.并发控制 为啥要进行并发控制? 并发的任务对同一个临界资源进行操作,如果不采取措施,可能导致不一致,故必须进行并发控制(Concurrency Control). 技术上,通常如何进行并发控制? ...