hdu 3652 B-number
B-number
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1654 Accepted Submission(s): 902
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
2010 Asia Regional Chengdu Site —— Online Contest
Recommend
lcy
参考: http://hi.baidu.com/sunnydaughter/item/69d3f9330b7c7f88c2cf29ea
1 //31MS 272K 943 B C++ 2 //记忆化搜索解数位DP 3 /* 4 5 dp[i][j][k]: 6 i表示数的第i位 7 j表示第i位前的位数和 %13 8 k表示是否有13(0为没有,1为有'1',2为有'13') 9 10 */ 11 #include<stdio.h> 12 #include<string.h> 13 int dp[10][15][3]; 14 int digit[10]; 15 int dfs(int pos,int pre,int have,int judge) 16 { 17 if(pos==-1) return pre==0&&have==2; //模13为0且有'13'符合 18 if(!judge && dp[pos][pre][have]!=-1) 19 return dp[pos][pre][have]; 20 int ans=0; 21 int end=judge?digit[pos]:9; 22 for(int i=0;i<=end;i++){ 23 int tpre=(pre*10+i)%13; 24 int thave=have; 25 if(have==1 && i!=1) thave=0; 26 if(have==0 && i==1) thave=1; 27 if(have==1 && i==3) thave=2; 28 ans+=dfs(pos-1,tpre,thave,judge&&i==end); 29 } 30 if(!judge) dp[pos][pre][have]=ans; 31 return ans; 32 } 33 int deal(int n) 34 { 35 memset(digit,0,sizeof(digit)); 36 memset(dp,-1,sizeof(dp)); 37 int pos=0; 38 while(n){ 39 digit[pos++]=n%10; 40 n/=10; 41 } 42 return dfs(pos-1,0,0,1); 43 } 44 int main(void) 45 { 46 int n; 47 while(scanf("%d",&n)!=EOF) 48 { 49 printf("%d\n",deal(n)); 50 } 51 return 0; 52 }