• Ural Amount of Degrees(数位dp)


    Amount of Degrees

    Time limit: 1.0 second
    Memory limit: 64 MB

    Description

    Create a code to determine the amount of integers, lying in the set [X;Y] and being a sum of exactly K 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

    inputoutput
    15 20
    2
    2
    
    3
    

     

    解题思路

    题意:

    思路:

    #include<iostream>
    #include<string>
    using namespace std;
    int f[32][32];
    
    int change(int x, int b)
    {
        string s;
        do
        {
            s = char('0' + x % b) + s;
            x /= b;
        }
        while (x > 0);
        for (int i = 0; i < s.size(); ++i)
            if (s[i] > '1')
            {
                for (int j = i; j < s.size(); ++j) s[j] = '1';
                break;
            }
        x = 0;
        for (int i = 0; i < s.size(); ++i)
            x = x | ((s[s.size() - i - 1] - '0') << i);   //或运算,在此相当于加法
        return x;
    }
    
    void init()//预处理f
    {
        f[0][0] = 1;
        for (int i = 1; i <= 31; ++i)
        {
            f[i][0] = f[i - 1][0];
            for (int j = 1; j <= i; ++j) f[i][j] = f[i - 1][j] + f[i - 1][j - 1];
        }
    }
    
    int calc(int x, int k) //统计[0..x]内二进制表示含k个1的数的个数
    {
        int tot = 0, ans = 0; //tot记录当前路径上已有的1的数量,ans表示答案
        for (int i = 31; i > 0; --i)
        {
            if (x & (1 << i))     //该位上是否为1
            {
                ++tot;
                if (tot > k) break;
                x = x ^ (1 << i);  //将这一位置0
            }
            if ((1 << (i - 1)) <= x)
            {
                ans += f[i - 1][k - tot];
            }
        }
        if (tot + x == k) ++ans;
        return ans;
    }
    
    int main()
    {
        int x, y, k, b;
        cin >> x >> y >> k >> b;
        x = change(x, b);
        y = change(y, b);
        init();
        cout << calc(y, k) - calc(x - 1, k) << endl;
        return 0;
    }
    

      

  • 相关阅读:
    Java后端WebSocket的Tomcat实现
    Swift学习资源
    jwplayer 隐藏属性方法记载
    简单的java socket 示例
    SQL SERVER 2008/2012/2012R2/2014 设置开启远程连接(sa配置)
    JS原型继承和类式继承
    理解js中的原型链,prototype与__proto__的关系
    C# 事件(Event)
    Java 与 JavaScript 对websocket的使用
    C# 版dll 程序集合并工具
  • 原文地址:https://www.cnblogs.com/ZhaoxiCheung/p/6782545.html
Copyright © 2020-2023  润新知