• Timus Online Judge 1057. Amount of Degrees(数位dp)


    1057. Amount of Degrees

    Time limit: 1.0 second
    Memory limit: 64 MB
    Create a code to determine the amount of integers, lying in the set [X;Y] and being a sum of exactlyK different integer degrees of B.
    Example. Let X=15, Y=20, K=2, B=2. By this example 3 numbers are the sum of exactly two integer degrees of number 2:
    17 = 24+20,
    18 = 24+21,
    20 = 24+22.

    Input

    The first line of input contains integers X and Y, separated with a space (1 ≤ X ≤ Y ≤ 231−1). The next two lines contain integers K and B (1 ≤ K ≤ 20; 2 ≤ B ≤ 10).

    Output

    Output should contain a single integer — the amount of integers, lying between X and Y, being a sum of exactly K different integer degrees of B.

    Sample

    input output
    15 20
    2
    2
    
    3


    /*
    题意: 求一个区间的 degree进制的1的个数为k的数的个数
    思路:数位dp,一定要注意是1个个数为k  dp[i][j][k] 代表到达了i位的j进制还差k个1
    
    详细注意的地方写在了代码中
    */
    
    
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<set>
    #include<map>
    
    #define L(x) (x<<1)
    #define R(x) (x<<1|1)
    #define MID(x,y) ((x+y)>>1)
    
    #define bug printf("hihi
    ")
    
    #define eps 1e-8
    
    typedef long long ll;
    
    using namespace std;
    
    #define N 35
    
    int dp[33][15][33];
    
    int degree,k;
    int bit[N];
    
    int dfs(int pos,int degree,int t,bool bound)
    {
         if(t<0) return 0;
         if(pos==0) return t ? 0:1;
         if(!bound&&dp[pos][degree][t]>=0) return dp[pos][degree][t];
         int up=bound ? min(bit[pos],1):1;
         int ans=0;
         for(int i=0;i<=up;i++)
            ans+=dfs(pos-1,degree,t-i,bound&&i==bit[pos]); //必须是bit[pos],不能是uo
         if(!bound) dp[pos][degree][t]=ans;
         return ans;
    }
    
    int solve(int x)
    {
        int i,j;
        int len=0;
        while(x)
        {
            bit[++len]=x%degree;
            x/=degree;
        }
        return dfs(len,degree,k,true);
    }
    
    int main()
    {
        int i,j,le,ri;
        memset(dp,-1,sizeof(dp));
    
        while(~scanf("%d%d",&le,&ri))
        {
            scanf("%d%d",&k,°ree);
            printf("%d
    ",solve(ri)-solve(le-1));
        }
       return 0;
    }
    


  • 相关阅读:
    Python-time和datetime模块
    Python-hashlib模块
    Python-利用flask模块创建web接口
    Python-操作Excel
    2
    1
    8
    7
    HDFS元数据管理实战篇
    使用HttpFS网关从防火墙后面访问HDFS
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7280232.html
Copyright © 2020-2023  润新知