zoukankan      html  css  js  c++  java
  • hdu3652 B-number (含有13并且是13 的倍数)数位dp

    题意:http://acm.hdu.edu.cn/showproblem.php?pid=3652

    问 从0到n 多少个数字是13倍数并且含有子串13

    记一下当前的余数,是否已经是13倍数和上一位的数字大小

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    #include<queue>
    #include<map>
    #include<vector>
    #include<math.h>
    #include<string>
    using namespace std;
    #define INF 0x3f3f3f3f
    #define LL long long
    #define N 106
    #define Lson rood<<1
    #define Rson rood<<1|1
    LL dp[20][20][14][3],d[20];
    LL dfs(int now,int up,int mod,int falg,int fp)
    {///保留上一个数up 以及对13取余mod 是否含有13的falg
        if(now==1) return !mod&&falg;///同时成立
        if(!fp&&dp[now][up][mod][falg]!=-1) return dp[now][up][mod][falg];
        LL ans=0;
        int ma=fp?d[now-1]:9;
        for(int i=0;i<=ma;i++)
            ans+=dfs(now-1,i,(mod*10+i)%13,(up==1&&i==3)||falg,fp&&i==ma);
        if(!fp&&dp[now][up][mod][falg]) dp[now][up][mod][falg]=ans;
        return ans;
    }
    LL calc(LL x)
    {///模板分离
        LL xxx=x;
        int len=0;
        while(xxx)
        {
            d[++len]=xxx%10;
            xxx/=10;
        }
        LL sum=0;
        for(int i=0;i<=d[len];i++)
            sum+=dfs(len,i,i,0,i==d[len]);
        return sum;
    }
    int main()
    {
        LL n;
        memset(dp,-1,sizeof(dp));
        while(scanf("%lld",&n)!=EOF)
            printf("%lld
    ",calc(n));
        return 0;
    }
  • 相关阅读:
    JAVA周二学习总结
    2019春总结作业
    第十二周作业
    第十一周作业
    第十周作业
    第九周作业
    第八周作业
    第七周作业
    第六周作业
    第四周课程总结&试验报告(二)
  • 原文地址:https://www.cnblogs.com/a719525932/p/7760316.html
Copyright © 2011-2022 走看看