zoukankan      html  css  js  c++  java
  • beautiful number 数位dp

        题意:  求高位往低位递减且  高位%低位==0(相邻) 数字数量

    唯一要注意的就是前导零!!!!!!(正因为这个前导零   一开始的pre设置为0       )

    比如  11  10 09 08 07 06 05 .。。。。说明要判断前导零

    #include<bits/stdc++.h>
    using namespace std;
    //input by bxd
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i>=(b);--i)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m)
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define ll long long
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define inf 0x3f3f3f3f
    #define N 10+5
    ll dp[N][15];
    ll a[N];
    
    ll dfs(int pos,int pre,   bool lead,bool limit  )
    {
        if(!pos)return 1;
    
        if(!limit&&!lead&&dp[pos][pre]!=-1)return dp[pos][pre];
        ll ans=0;
        int up=limit?a[pos]:9;
        rep(i,0,up)
        {
            if(lead||pre>=i&&i&&pre%i==0)
            ans+=dfs(pos-1,i,   lead&&i==0,limit&&i==a[pos]);
        }
        if(!limit&&!lead)dp[pos][pre]=ans;
        return ans;
    }
    ll solve(ll x)
    {
        int pos=0;
        while(x)
        {
            a[++pos]=x%10;
            x/=10;
        }
        return dfs(pos,0,true,true);
    }
    int main()
    {
        int cas;
        RI(cas);
        CLR(dp,-1);
        while(cas--)
        {
            ll a,b;
            cin>>a>>b;
            printf("%lld
    ",solve(b)-solve(a-1));
        }
        return 0;
    }
    View Code
  • 相关阅读:
    写个三个月后的我
    设置gridcontrol的焦点行
    希望我能更快的成长
    女人最想要的是什么
    初始化时查看combox的文本内容
    获取一个gridcontrol的数据行数
    第八章:Applet基础学习
    浅谈研发项目经理的技能要求
    学习C和C++应该看的书
    双缓冲绘图
  • 原文地址:https://www.cnblogs.com/bxd123/p/10726023.html
Copyright © 2011-2022 走看看