题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3652

题解:先预处理([0,0][1,1],[2,2]....[0,9],[10, 19],[20,29]......[900000000, 1000000000]  区域中 有子串13 (用1表示)余数为0,1,2.。。12的个数。以及 无子串13(用0表示)余数为0,1,2,3.。。12 的个数。

四维数组dp【一共多少位数】【最高位的数】【是否含有子串13】【余数】 例如  dp[4][1][1][0] 表示 (【1000,2000))(四位, 最高位数为1), 子串中含有13, 且余数为0的个数。

dp[a][b][c][d]

当求a = 2时必须 a=1的元素都已知,例如 求[20, 29)中含有13, 余数为3的个数。 即 dp【2】【2】【0】【3】 ,由于 [20, 29)可看做 20 + x(0—9)。而20 % 13 = 7, 只需找余数为9. 则 sum( dp【1】【j】【0】【9】)(j= 0,1,2.。。。9)。

需注意的是 当b = 1 时, 由于在低一位上有3,  所以这种情况要分开求。

/***Good Luck***/
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <stack>
#include <map>
#include <queue>
#include <vector>
#include <set>
#include <functional>
#include <cmath>
#include <numeric> #define Zero(a) memset(a, 0, sizeof(a))
#define Neg(a) memset(a, -1, sizeof(a))
#define All(a) a.begin(), a.end()
#define PB push_back
#define inf 0x3f3f3f3f
#define inf2 0x7fffffffffffffff
#define ll long long
using namespace std;
//#pragma comment(linker, "/STACK:102400000,102400000")
void get_val(int &a) {
int value = , s = ;
char c;
while ((c = getchar()) == ' ' || c == '\n');
if (c == '-') s = -s; else value = c - ;
while ((c = getchar()) >= '' && c <= '')
value = value * + c - ;
a = s * value;
}
const int maxn = ;
int dp[maxn][maxn][][maxn];
int n; void change1(int i, int j, int m) {
for (int k = ; k <= ; ++k)
for (int kk = ; kk <= ; ++kk) {
dp[i][j][][(kk - m + ) % ] += dp[i - ][][k][kk];
}
} void change2(int i, int m,int j, int jj) {
for (int k = ; k <= ; ++k)
for (int kk = ; kk <= ; ++kk) {
dp[i][j][k][(kk + m) % ] += dp[i - ][jj][k][kk];
}
}
void init() {
Zero(dp);
int w = , m;
dp[][][][] = ;
for (int i = ; i <= ; ++i) dp[][i][][i] = ;
for (int i = ; i <= ; ++i) {
for (int j = ; j <= ; ++j) { for (int jj = ; jj <= ; ++jj) {
m = (j * w) % ;
if (j == && jj == ) {
m = (jj * w / )% ;
change1(i, j, m);
} else
change2(i, m, j, jj);
}
}
w *= ;
}
} int cal(int n1) {
if (n1 == ) return ;
char ch[];
Zero(ch);
int i = ;
int flag = -;
int ret = ;
while (n1) {
ch[i++] = n1 % + '';
n1 /= ;
}
for (int j = i - ; j > ; --j) {
if (ch[j] == '' && ch[j - ] == '') {
flag = j - ;
break;
}
}
n1 = n / ;
int w = ;
for (int j = ; j <= i; ++j) {
for (int jj = ; jj < ch[j] - ''; ++jj) {
int t = (n1 * ) * w % ;
if (jj == && ch[j + ] == '') {
t = (n1 / * ) * w % ;
ret += dp[j][][][( - t) % ] + dp[j ][][][( - t) % ];
continue;
}
if (flag > j) {
ret += dp[j][jj][][( - t) % ] + dp[j][jj][][( - t) % ];
} else {
ret += dp[j][jj][][( - t) % ];
}
}
w *= ;
n1 /= ;
}
if (n % == && flag != -) ret++;
return ret;
}
int main() {
//freopen("data.out", "w", stdout);
//freopen("data.in", "r", stdin);
//cin.sync_with_stdio(false);
init();
while (cin >> n) {
cout << cal(n) << endl;
}
return ;
}

【dp】B-number的更多相关文章

  1. HDOJ 1501 Zipper 【DP】【DFS+剪枝】

    HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...

  2. HDOJ 1159 Common Subsequence【DP】

    HDOJ 1159 Common Subsequence[DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...

  3. 【LeetCode】792. Number of Matching Subsequences 解题报告(Python)

    [LeetCode]792. Number of Matching Subsequences 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://f ...

  4. 【LeetCode】673. Number of Longest Increasing Subsequence 解题报告(Python)

    [LeetCode]673. Number of Longest Increasing Subsequence 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https:/ ...

  5. 【POJ2104】【HDU2665】K-th Number 主席树

    [POJ2104][HDU2665]K-th Number Description You are working for Macrohard company in data structures d ...

  6. 【SPOJ】NUMOFPAL - Number of Palindromes(Manacher,回文树)

    [SPOJ]NUMOFPAL - Number of Palindromes(Manacher,回文树) 题面 洛谷 求一个串中包含几个回文串 题解 Manacher傻逼题 只是用回文树写写而已.. ...

  7. Kattis - honey【DP】

    Kattis - honey[DP] 题意 有一只蜜蜂,在它的蜂房当中,蜂房是正六边形的,然后它要出去,但是它只能走N步,第N步的时候要回到起点,给出N, 求方案总数 思路 用DP 因为N == 14 ...

  8. HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】

    HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...

  9. HDOJ 1257 最少拦截系统 【DP】

    HDOJ 1257 最少拦截系统 [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...

  10. HDOJ_1087_Super Jumping! Jumping! Jumping! 【DP】

    HDOJ_1087_Super Jumping! Jumping! Jumping! [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...

随机推荐

  1. dos命令创建批处理脚本

    win+r  打开cmd 输入 copy con  1.bat 回车 进入编辑状态输入 @echo off echo xxxx Ctrl+z 结束编辑   会在当前目录生成一个bat文件

  2. 百万年薪python之路 -- 函数名的第一类对象及使用

    函数名是一个变量, 但它是一个特殊的变量, 与括号配合可以执行函数的变量 1.1.函数名的内存地址 def func(): print("呵呵") print(func) 结果: ...

  3. 简单多层神经网络实现异或XOR

    最近在看<Neural Network Design_Hagan> 然后想自己实现一个XOR 的网络. 由于单层神经网络不能将异或的判定分为两类. 根据 a^b=(a&~b)|(~ ...

  4. codeblocks 调试不停止的解决办法。

    CB的工程路径不能有中文,也不能有空格. 所以一定要全英文路径,而且空格要用下划线代替. 否则,调试的时候,codeblocks不会在断点处停止.

  5. WinDbg命令系统

    WinDbg命令系统 WinDbug三种命令 WinDbug是一个强大的调试器,大部分很多功能都是通过命令来实现的,命令在命令窗口中输入,主要分为以下三类: 标准命令 标准命令提供了调试器的基本功能, ...

  6. ArcGIS Engine空间分析之拓扑分析的实现

    简单介绍: 拓扑学是一门研究几何图形位置关系的科学. GIS所关注的拓扑主要集中在拓扑关系——存在于地理实体间的拓扑关系. 拓扑关系在GIS中起着描述两个地理实体的相对空间位置的重要作用.它是GIS空 ...

  7. 20190906_matplotlib_学习与快速实现

    20190906 Matplotlib 学习总结 第一部分: 参考连接: Introduction to Matplotlib and basic line https://www.jianshu.c ...

  8. 第三十七章 POSIX线程(一)

    POSIX线程库相关介绍   与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都有"pthread_"开头   要使用这些函数库,都需要加入头文件"<pth ...

  9. 使用 HTML5 WebSocket 构建实时 Web 应用

    原文地址:http://www.ibm.com/developerworks/cn/web/1112_huangxa_websocket/ HTML5 WebSocket 简介和实战演练 本文主要介绍 ...

  10. 洛谷P2858 【[USACO06FEB]奶牛零食Treats for the Cows】

    我们可以记录头和尾再加一个卖了的零食数目,如果头超过尾就return 0. 如果遇到需要重复使用的数,(也就是不为零的d数组)就直接return d[tuo][wei]. 如果没有,就取卖头一个与最后 ...