B-number
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1658 Accepted Submission(s): 906
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数位dp,要判定mol13为0才行!#include <iostream> #include <stdio.h> #include <string.h> using namespace std; #define M 23 int dp[M][15][3],pri[M]; int get(int t,int i){ if(t==2||(t==1&&i==3))return 2; if(i==1)return 1; return 0; } int dfs(int pos,int pre,int t,int flag ){ if(pos==0)return pre==0&&t==2; if(!flag&&dp[pos][pre][t]!=-1)return dp[pos][pre][t]; int ans=0,u=flag?pri[pos]:9; for(int i=0;i<=u;i++){ ans+=dfs(pos-1,(pre*10+i)%13,get(t,i),flag&&i==u); //printf("%d %d %d\n",ans,pos,i); } return flag?ans:dp[pos][pre][t]=ans; } int solve(int x){ int cnt=0; while(x){ pri[++cnt]=x%10; x/=10; } return dfs(cnt,0,0,1); } int main() { int n; memset(dp,-1,sizeof(dp)); while(scanf("%d",&n)!=EOF){ printf("%d\n",solve(n)); } return 0; }