HDU3652 B-number

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=3652

 

#include<bits/stdc++.h>
using namespace std;
int dp[25][10][2][200];//dp[pos][last digit][13 is exist][num%13]
vector<int>shu;
int dfs(int pos,int last,int exist13,int num,int sp){
    if(pos==-1) return exist13&&num%13==0;
    if(!sp&&dp[pos][last][exist13][num]!=-1) return dp[pos][last][exist13][num];
    int ans=0;
    int maxn=sp?shu[pos]:9;
    for(int i=0;i<=maxn;i++){
        ans+=dfs(pos-1,i,exist13||(last==1&&i==3),(num*10+i)%13,sp&&i==maxn);
    }
    if(!sp) dp[pos][last][exist13][num]=ans;
    return ans;
}
int cal(int num){
    shu.clear();
    while(num){
        shu.push_back(num%10);
        num/=10;
    }
    return dfs(shu.size()-1,0,0,0,1);
}
int main(){
    memset(dp,-1,sizeof(dp));
    int n;
    while(~scanf("%d",&n)){
        printf("%d\n",cal(n));
    } 
}

 

posted on 2020-08-10 11:04  学无止境的小程序员  阅读(93)  评论(0编辑  收藏  举报

导航