Description

统计区间\([1,n]\)中是\(13\)的倍数且数字中含有“13”的数的个数。

Input

多组用例,处理到文件尾。每组用例给出一个整数\(n\)。\(1 \leqslant n \leqslant 10^9\)

Output

对于每组用例输出一行,表示区间中满足条件的数的数量。

Sample Input

13
100
200
1000

Sample Output

1
1
2
2

Solution

数位DP。要满足的条件有两个:1. 是\(13\)的倍数。2. 含有“13”。

\(dp[pos][r][s][f]\),\(pos\)表示统计的是第\(pos\)到第\(0\)位,\(r\)表示前面的数位对当前产生的余数,\(s\)表示上一位是否为\(1\),\(f\)表示处理到目前为止是否已经有了\(13\)。

如果前面的位置产生的余数是\(r\),当前\(pos\)位的数字是\(i\),那么传给\(pos-1\)位的余数就是\((r+i) \times 10 \mod 13\)。

如果上一位是\(1\),也就是\(s\)为\(true\),且当前位为\(3\)时,说明出现了\(13\),\(f\)标记为\(true\)。

当所有的位置都处理完毕,当且仅当余数为\(0\)且\(f\)为\(true\)时,说明产生了一个合法的数。

Code

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int N = 15;int dp[N][15][2][2], a[N];int dfs(int pos, int r, bool s, bool f, bool fp)
{if (pos < 0) return r == 0 && f;if (!fp && dp[pos][r][s][f] != -1) return dp[pos][r][s][f];int ans = 0, fpmax = fp ? a[pos] : 9;for (int i = 0; i <= fpmax; i++)ans += dfs(pos - 1, (r + i) * 10 % 13, i == 1, f || s && i == 3, fp && i == fpmax);if (!fp) dp[pos][r][s][f] = ans;return ans;
}int calc(int n)
{int len = 0;while (n) a[len++] = n % 10, n /= 10;return dfs(len - 1, false, false, 0, true);
}int main()
{int n;memset(dp, -1, sizeof(dp));while (~scanf("%d", &n)){printf("%d\n", calc(n));}return 0;
}

Link

http://acm.hdu.edu.cn/showproblem.php?pid=3652

转载于:https://www.cnblogs.com/dadamrx/p/7422267.html

HDU 3652 B-number (数位DP)相关推荐

  1. HDU 3709 Balanced Number (数位DP)

    题意 求出[x, y] 范围内的平衡数,平衡数定义为:以数中某个位为轴心,两边的数的偏移量为矩,数位权重,使得整个数平衡. 思路 外层枚举平衡点,然后数位DP即可.设计状态: dp[pos][o][l ...

  2. HDU - 3709 Balanced Number(数位dp)

    题目链接:点击查看 题目大意:将一串数字视为天平,两端平衡的数字称为平衡数,并求出一段闭区间中平衡数的个数.所谓的平衡条件即为力臂与 力相乘后两端的数量和可以抵消,例如数字4139可以视为以3为中轴的 ...

  3. HDU 5787 wolf Number 数位dp

    题意 题目就是说让我们在l到r的数字中求得有多少个连续k为不相同的数 1≤L≤R≤1e18 2≤K≤5 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...

  4. hdu 3652 B-number(数位DP)

    传送门 参考博文: [1]:http://www.voidcn.com/article/p-drrnjrmy-wm.html 题意: 找出区间内数中含有13的并且能被13整除的数的个数 题解: 搜了好 ...

  5. HDU odd-even number 数位dp

    题意 在l到r区间内求有多少个符合条件"当前数中所有连续的奇数长度是偶数 所有连续的偶数长度是奇数"的个数 分析 典型的数位dp问题 我们设置dp数组时可以根据 dp[pos][p ...

  6. HDU 3555 Bomb(数位DP模板啊两种形式)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 Problem Description The counter-terrorists found ...

  7. HDU 6156 Palindrome Function 数位DP

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6156 题目描述: 求L~R所有的数的l~r进制的f(x), f(x) = 当前进制 如果回文串, f ...

  8. Hdu 2089-不要62 数位dp

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=2089 不要62 Time Limit: 1000/1000 MS (Java/Others)    Me ...

  9. HDU 2089 不要62 数位DP

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2089 题目描述: 给定一个区间, 让你求这个区间中所有不带62 或 4 的数的个数 解题思路: 很明 ...

  10. fzu 2109 Mountain Number 数位DP

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=2109 题意: 如果一个>0的整数x,满足a[2*i+1] >= a[2*i]和a[2*i+2],则 ...

最新文章

  1. 动态加载用户控件的怪问题
  2. Hibernate的四种典型例子(增删改查)
  3. proc maps分析coredump
  4. HDFS集中式的缓存管理原理与代码剖析--转载
  5. [css] 怎么让body高度自适应屏幕?为什么?
  6. 绝地求生测试服画面优化软件,绝地求生正式服设置详解 教你调校最完美的画质...
  7. 解决win2003不支持FLV播放的方法
  8. python 把xml中含有特殊字段的部分提取出来_Python: 爬虫网页解析工具lxml.html(一)...
  9. vulkan api_Vulkan开放标准API支持,针对Linux的新游戏以及更多游戏
  10. 只要你能想明白一个道理,你也可以在互联网上赚到属于自己的钱
  11. spark内核揭秘-06-TaskSceduler启动源码解析初体验
  12. 通过谓词查找第一个元素
  13. MapReduce 原理及执行过程
  14. 说说携程准备推出的「3+2」工作模式。
  15. python 生孩子朋友圈_生娃报喜朋友圈文案 孩子出生发朋友圈的话
  16. 在MATLAB中快速画圆(给出圆心坐标和半径就能直接画的那种)
  17. 磁共振成像原理-物理基础2(质子在外部磁场的情况)
  18. mac sublime中文乱码问题解决
  19. java中相对路径_java相对路径设置 | 学步园
  20. 天龙八部服务器维护怎么进去,天龙八部怎么进不去?维护了吗?到什么时候?...

热门文章

  1. Android自定义柱状图表效果
  2. Linux truncate的使用方法介绍
  3. Linux 多线程编程 实例 1
  4. 多学一点(五)——在Linux下安装配置Apache
  5. 【Cloud Foundry 应用开发大赛】“八卦街”图片采集应用
  6. oracle 查看锁死的表
  7. 第一个程序03 - 零基础入门学习汇编语言22
  8. idea编译android模块,Android IntelliJ IDEA 14.1:模块没有主类
  9. php软件开发--laravel框架
  10. 开源项目参与_通过更好的文档吸引更多的项目参与人