HDU 3652 B-number (数位dp)
2015-09-05 20:51
453 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3652
题意:求数1-n中,包含序列“13”且能被13整除的数的个数。
思路:用数位dp记忆化搜索模版。
代码:
题意:求数1-n中,包含序列“13”且能被13整除的数的个数。
思路:用数位dp记忆化搜索模版。
代码:
#include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> #define MOD 1000000007 #define INF 0x7fffffff using namespace std; typedef long long ll; int bit[15]; ll f[15][5][20]; ll dp(int pos, int sta, int flag, int left) { //第len到pos+1位已确定,现在确定第pos位 //sta=1,前面包含了序列13 //flag=1,不论第pos位为什么都比n小 //第len到pos+1组成的数除以13余left if(pos == 0) return (sta == 2 && left == 0); if(flag && f[pos][sta][left] != -1) return f[pos][sta][left]; ll ans = 0; int x = flag ? 9 : bit[pos]; for(int i = 0; i <= x; i++) { if(sta == 2 || (sta == 1 && i == 3)) { ans += dp(pos - 1, 2, flag || i < x, (left * 10 + i) % 13); } else if(i == 1) { ans += dp(pos - 1, 1, flag || i < x, (left * 10 + i) % 13); } else { ans += dp(pos - 1, 0, flag || i < x, (left * 10 + i) % 13); } } if(flag) f[pos][sta][left] = ans; return ans; } ll cal(ll n) { int len = 0; while(n) { bit[++len] = n % 10; n /= 10; } ll ans = dp(len, 0, 0, 0); return ans; } int main() { #ifdef LOCAL freopen("dpdata.txt", "r", stdin); #endif ll n; memset(f, -1, sizeof(f)); while(scanf("%I64d", &n) != EOF) { printf("%I64d\n", cal(n)); } return 0; }
相关文章推荐
- 1006. 换个格式输出整数 (15)
- 深入理解Activity(小补充)
- Android 源代码结构(转)
- 黑马程序员---网络编程(简介、UDP传输)
- hdu 5427 A problem of sorting
- Android开发在路上:少去踩坑,多走捷径(转)
- 服务接口API限流 Rate Limit
- hdu 1754 线段树 单点更新 动态区间最大值
- 上拉电阻与下拉电阻的作用总结
- UI_16 XML、JSON数据结构解析
- android开源项目和框架
- Zabbix安装
- linux 报 外部非精确异常
- mongodb学习05 操作详解(3)
- 装机——没什么(更改电脑硬盘分区格式)
- Block 在不同情况下的变量存储区域
- 装机——没什么(更改电脑硬盘分区格式)
- CSS 属性 :before && :after的用法,伪类和伪元素的区别
- OS---net start mysql 发生系统错误5
- 一步步开发自己的博客 .NET版(4、文章发布功能)百度编辑器