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.
13 100 200 1000
1 1 2 2
题意:找出1~n范围内含有13并且能被13整除的数字的个数
思路:使用记忆化深搜来记录状态,配合数位DP来解决
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int b[22];
int dp[22][22][2][15];
int dfs(int pos,int pre,int status,int r,int limit)
{
if(pos<0) return (r==0 && status);
if(!limit && dp[pos][pre][status][r]!=-1) return dp[pos][pre][status][r];
int end = limit?b[pos]:9;
int ret = 0;
for(int i=0;i<=end;i++) {
ret+=dfs(pos-1,i,status||(pre==1&&i==3),(r*10+i)%13,limit&&(i==end));
}
if(!limit) dp[pos][pre][status][r] = ret;
return ret;
}
int work(int num)
{
int cnt=0;
memset(b,0,sizeof(b));
while(num) {
b[cnt++]=num%10;
num/=10;
}
return dfs(cnt-1,9,0,0,1);
}
int main()
{
int T,n;
memset(dp,-1,sizeof(dp));
while(scanf("%d",&n)!=EOF) {
printf("%d\n",work(n));
}
return 0;
}