HDU 3652 B-Number(数位dp)

来源:互联网 发布:java电商项目视频教程 编辑:程序博客网 时间:2024/05/01 20:57

题目链接:

HDU 3652 B-Number

题意

[1,n]中含有子串“13”并且能被13整除的数字个数。
数据范围:1n109

分析

记录高位模13的余数,和前一位数字,以及高位是否出现子串“13”即可。

Code

#include <stdio.h>#include <string.h>#include <math.h>#include <algorithm>using namespace std;typedef long long ll;int digit[10], dp[10][10][15][2];int dfs(int pos, int rem, int pre, int state, int limit){    if (pos == -1) return rem == 0 && state;    if (!limit && dp[pos][pre][rem][state] != -1) return dp[pos][pre][rem][state];    int last = limit ? digit[pos] : 9;    int ret = 0;    for (int i = 0; i <= last; ++i) {        ret += dfs(pos - 1, (rem * 10 + i) % 13, i, state || (i == 3 && pre == 1), limit && (i == last));    }    if (!limit) dp[pos][pre][rem][state] = ret;    return ret;}int solve(int x){    memset(digit, 0, sizeof(digit));    int len = 0;    while (x) {        digit[len++] = x % 10;        x /= 10;    }    return dfs(len - 1, 0, 0, 0, 1);}int main(){    int n;    memset(dp, -1, sizeof (dp));    while (~scanf("%d", &n)) {        printf("%d\n", solve(n));    }    return 0;}
0 0
原创粉丝点击