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
代码
#include<stdio.h>
#include<string.h>
using namespace std;
typedef long long ll;
int a[20];
int dp[20][15][3];
//dp[pos][mod][have]
//pos:当前位置
//mod:余数
//have :0:前一位不是1 1:前一位是1 2:有13
ll Dfs(int pos,int mod,int have,bool limit){
int modx,havex;
if(pos==-1) return mod==0&&have==2;
if(!limit&&dp[pos][mod][have]!=-1) return dp[pos][mod][have];//没有上限并且已被访问过
int up=limit?a[pos]:9;
ll cnt=0,i;
for(i=0;i<=up;i++){
modx=(mod*10+i)%13;
havex=have;
if(have==0&&i==1) havex=1;
if(have==1&&i!=1) havex=0;
if(have==1&&i==3) havex=2;
cnt+=Dfs(pos-1,modx,havex,limit&&i==a[pos]);
}
if(!limit) dp[pos][mod][have]=cnt;
return cnt;
}
ll solve(ll x){
int pos=0;
while(x){
a[pos++]=x%10;
x/=10;
}
return Dfs(pos-1,0,0,true);
}
int main(){
ll n;
memset(dp,-1,sizeof(dp));
while(scanf("%lld",&n)!=EOF){
printf("%lld\n",solve(n));
}
return 0;
}