#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,a[20],dp[20][4][20];
int dfs(int pos,int sta,bool limit,int p){
if(pos==-1) return p==0&&sta==2;
if(!limit && dp[pos][sta][p]!=-1) return dp[pos][sta][p];
int up=limit?a[pos]:9,tmp=0;
for(int i=0;i<=up;i++){
int staa=sta;
if(i==3&&sta==1) staa=2;
else if(i==1&&sta==0) staa=1;
else if(i!=1&&sta==1) staa=0;
tmp+=dfs(pos-1,staa,limit&&i==a[pos],(p*10+i)%13);
}
if(!limit) dp[pos][sta][p]=tmp;
return tmp;
}
int solve(int x){
int pos=0;
while(x){
a[pos++]=x%10;
x/=10;
}
return dfs(pos-1,0,1,0);
}
int main(){
while(scanf("%d",&m)==1){
memset(dp,-1,sizeof(dp));
printf("%d\n",solve(m));
}
}
【数位dp】B-number
最新推荐文章于 2019-12-15 14:49:00 发布