HDU 3652 数位dp

Posted 半根毛线code

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 3652 数位dp相关的知识,希望对你有一定的参考价值。

B-number

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5894    Accepted Submission(s): 3389


Problem Description
A wqb-number, or B-number for short, is a non-negative integer whose decimal form contains the sub- string "13" and can be divided by 13. For example, 130 and 2613 are wqb-numbers, but 143 and 2639 are not. Your task is to calculate how many wqb-numbers from 1 to n for a given integer n.
 

 

Input
Process till EOF. In each line, there is one positive integer n(1 <= n <= 1000000000).
 

 

Output
Print each answer in a single line.
 

 

Sample Input
13 100 200 1000
 

 

Sample Output
1 1 2 2
 

 

Author
wqb0039
 

 

Source
 
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <stack>
 7 #include <queue>
 8 #include <cmath>
 9 #include <map>
10 #define ll  __int64
11 #define mod 1000000007
12 #define dazhi 2147483647
13 #define bug() printf("!!!!!!!")
14 #define M 100005
15 using namespace  std;
16 ll bit[100];
17 ll dp[100][5][13];
18 ll n;
19 ll functi(int pos,ll pre,int flag ,int m)
20 {
21     if(pos==0) return (pre==2&&m==0);
22     if(flag&&dp[pos][pre][m]!=-1) return dp[pos][pre][m];
23     ll x=flag ? 9 : bit[pos];
24     ll ans=0;
25     for(ll i=0;i<=x;i++)
26     {
27         if(pre==2||(pre==1&&i==3))
28             ans+=functi(pos-1,2,flag||i<x,(m*10+i)%13);
29         else if(i==1)
30             ans+=functi(pos-1,1,flag||i<x,(m*10+i)%13);
31         else
32             ans+=functi(pos-1,0,flag||i<x,(m*10+i)%13);
33     }
34     return dp[pos][pre][m]=ans;
35 }
36 ll fun(ll x)
37 {
38     memset(dp,-1,sizeof(dp));
39     memset(bit,0,sizeof(bit));
40     int len=0;
41     while(x)
42     {
43         bit[++len]=x%10;
44         x/=10;
45     }
46     return functi(len,0,0,0);
47 }
48 int main()
49 {
50     while(scanf("%I64d",&n)!=EOF)
51     {
52         printf("%I64d\n",fun(n));
53     }
54     return 0;
55 }

 

以上是关于HDU 3652 数位dp的主要内容,如果未能解决你的问题,请参考以下文章

HDU 3652 数位dp

HDU-3652(数位dp)

hdu3652 数位dp

hdu-3652 B-number 数位DP

HDU 3652 - B-number - [数位DP]

HDU3652--容斥+数位dp