首页 > 其他分享 >Amount of Degrees 度的数量

Amount of Degrees 度的数量

时间:2024-07-12 15:11:40浏览次数:11  
标签:dfs return int len Amount Degrees ret limit 数量

自己的写法

// Amount of Degrees 度的数量.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

/*
* https://loj.ac/p/10163
* http://ybt.ssoier.cn:8088/problem_show.php?pid=1585
*
题目描述
原题来自:NEERC 2000 Central Subregional,题面详见 Ural 1057。

求给定区间 [X,Y] 中满足下列条件的整数个数:这个数恰好等于 K 个互不相等的 B 的整数次幂之和。
例如,设 X=15,Y=20,K=2,B=2,则有且仅有下列三个数满足题意:
17 = 2^4+2^0
18 = 2^4 + 2^1
20 = 2^4+2^2



输入格式
第一行包含两个整数 X 和 Y,接下来两行包含整数 K 和 B。

输出格式
只包含一个整数,表示满足条件的数的个数。

样例
输入
15 20
2
2
输出
3


对于全部数据,1<= X<= Y<= 2^31 - 1,1<= K<= 20,2<= B<= 10。
*/


#include <iostream>
#include <vector>
#include <cstring>


using namespace std;

int dp[35][35][2];
int K, B;

int dfs(const vector<int>& v, int len, int k, int limit) {
    int& ret = dp[len][k][limit];
    if (len == 0) {
        if (limit == 1) {
            if (v[len] >= 1)
                return k == 0 || k == 1;
            else if (v[len] == 0)
                return k == 0;
        }
        else {
            return  k == 0 || k == 1;
        }
    }

    if (ret != -1)
        return ret;

    ret = 0;

    if (limit == 0 || v[len] > 1) {
        ret += dfs(v, len - 1, k, 0);
        ret += dfs(v, len - 1, k - 1, 0);
    }
    else if (limit == 1) {
        if (v[len] == 0)
            ret += dfs(v, len - 1, k, 1);
        else if (v[len] == 1) {
            ret += dfs(v, len - 1, k, 0);
            ret += dfs(v, len - 1, k - 1, 1);
        }
    }

    return ret;
}



int calc(int n) {
    vector<int> v;
    memset(dp, -1, sizeof dp);

    while (n != 0) {
        v.push_back(n % B);
        n = n / B;
    }

    int ret = dfs(v, v.size() - 1, K, 1);
    return ret;
}



int main() {
    int x, y;
    cin >> x >> y >> K >> B;

    cout << calc(y) - calc(x - 1) << endl;


    return 0;
}

标签:dfs,return,int,len,Amount,Degrees,ret,limit,数量
From: https://www.cnblogs.com/itdef/p/18298397

相关文章

  • python编程实例 计算输入内容中数字、字母、空格、其它字符的数量 两种方式实现
    第一种方式为通过python自带函数实现第二种方式为通过ascii码实现点击查看代码#字符串构成,统计出字符串中#空格英文字符数字其它字符的数量'''使用自带函数a=input("请输入:")kong=0ying=0shu=0qita=0foriinrange(len(a)):if(a[i].isspace()):kong......
  • LeetCode 2950. 可整除子串的数量
    2950.可整除子串的数量每个英文字母都被映射到一个数字,如下所示。如果字符串的字符的映射值的总和可以被字符串的长度整除,则该字符串是 可整除 的。给定一个字符串 s,请返回 s 的 可整除子串 的数量。子串 是字符串内的一个连续的非空字符序列。示例1:Substrin......
  • 连续出牌数量 思路+代码(华为OD-C卷-200分-Python解法)
    题目描述有这么一款单人卡牌游戏,牌面由颜色和数字组成,颜色为红、黄、蓝、绿中的一种,数字为0-9中的一个。游戏开始时玩家从手牌中选取一张卡牌打出,接下来如果玩家手中有和他上一次打出的手牌颜色或者数字相同的手牌,他可以继续将该手牌打出,直至手牌打光或者没有符合条件可以继续......
  • 代码随想录算法训练营第57天 | 99.岛屿数量 深搜 、99.岛屿数量 广搜 、100.岛屿的最
    99.岛屿数量深搜注意深搜的两种写法,熟练掌握这两种写法以及知道区别在哪里,才算掌握的深搜。https://www.programmercarl.com/kamacoder/0099.岛屿的数量深搜.html/***@param{character[][]}grid*@return{number}*/varnumIslands=function(grid){letre......
  • P3022 [USACO11OPEN] Odd degrees G
    P3022[USACO11OPEN]OdddegreesG构造每个连通块独立,考虑其中一个如何构造。因为无向图的度数一定是偶数,而每个点的度数是奇数,所以点数为奇数,否则无解。考虑建dfs树,不关心非树边,只考虑树边的取舍构造。自底向上构造,假如当前\(u\)的儿子\(v\)为偶数,那么就不能取\((u,v)......
  • LeetCode 算法:岛屿数量 c++
    原题链接......
  • 当谈论掩码数位和IP总数时,通常是指在特定子网掩码下可用的IP地址数量。IPv4地址由32位
    当谈论掩码数位和IP总数时,通常是指在特定子网掩码下可用的IP地址数量。IPv4地址由32位二进制数组成,用四个八位字段表示,每个字段用点分十进制表示,例如192.168.1.1。子网掩码用于确定一个IP地址中哪些位是网络地址,哪些位是主机地址。常见的子网掩码包括:/24子网掩码:255.255.255.......
  • EasyExcel 单元格根据图片数量动态设置宽度
    在使用EasyExcel导出Excel时,如果某个单元格是图片内容,且存在多张图片,此时就需要单元格根据图片数量动态设置宽度。经过自己的研究和实验,导出效果如下:具体代码如下:EasyExcel版本<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactI......
  • Studying-代码随想录训练营day30| 452.用最少数量的箭引爆气球、435.无重叠区间、763.
    第30天,贪心part04,加油,编程语言:C++目录452.用最少数量的箭引爆气球435.无重叠区间 763.划分字母区间 总结 452.用最少数量的箭引爆气球文档讲解:代码随想录用最少数量的箭引爆气球视频讲解:手撕用最少数量的箭引爆气球题目:学习:根据题干,很直观的贪心逻辑就是尽可......
  • Exchange限制邮箱用户每天/每分钟的发送邮件数量和速率
    近期遇到部分Exchange客服反馈内部邮箱账号密码被盗,给内部其他同事和外部邮箱发送大量钓鱼和诈骗邮件;对公司造成很大负面影响和经济损失。为了在遇到此类情况时减少损失,建议可以通过Exchange来限制用户每天和每分钟的发送邮件数量和速率;这样一来,即使用户邮箱密码被盗,在发现问题之......