2^k进制数(对每部分代码详解)

news2026/4/4 23:53:32

2^k进制数

题目描述

r r r 是个 2 k 2^k 2k 进制数,并满足以下条件:

  • r r r 至少是个 2 2 2 位的 2 k 2^k 2k 进制数。

  • 作为 2 k 2^k 2k 进制数,除最后一位外, r r r 的每一位严格小于它右边相邻的那一位。

  • r r r 转换为二进制数 q q q 后,则 q q q 的总位数不超过 w w w

在这里,正整数 k , w k,w k,w 是事先给定的。

问:满足上述条件的不同的 r r r 共有多少个?

我们再从另一角度作些解释:设 S S S 是长度为 w w w 01 01 01 字符串(即字符串 S S S w w w 0 0 0 1 1 1 组成), S S S 对应于上述条件三中的 q q q。将 S S S 从右起划分为若干个长度为 k k k 的段,每段对应一位 2 k 2^k 2k 进制的数,如果 S S S 至少可分成 2 2 2 段,则 S S S 所对应的二进制数又可以转换为上述的 2 k 2^k 2k 进制数 r r r

例:设 k = 3 , w = 7 k=3,w=7 k=3,w=7。则 r r r 是个八进制数( 2 3 = 8 2^3=8 23=8 )。由于 w = 7 w=7 w=7,长度为 7 7 7 01 01 01 字符串按 3 3 3 位一段分,可分为 3 3 3 段(即 1 , 3 , 3 1,3,3 1,3,3,左边第一段只有一个二进制位),则满足条件的八进制数有:

2 2 2 位数:
高位为 1 1 1 6 6 6 个(即 12 , 13 , 14 , 15 , 16 , 17 12,13,14,15,16,17 12,13,14,15,16,17 ),
高位为 2 2 2 5 5 5 个,
…,
高位为 6 6 6 1 1 1 个(即 67 67 67 )。
6 + 5 + … + 1 = 21 6+5+…+1=21 6+5++1=21 个。

3 3 3 位数:
高位只能是 1 1 1
2 2 2 位为 2 2 2 5 5 5 个(即 123 , 124 , 125 , 126 , 127 123,124,125,126,127 123,124,125,126,127 ),
2 2 2 位为 3 3 3 4 4 4 个,
…,
2 2 2 位为 6 6 6 1 1 1 个(即 167 167 167 )。
5 + 4 + … + 1 = 15 5+4+…+1=15 5+4++1=15 个。

所以,满足要求的 r r r 共有 36 36 36 个。

输入格式

一行两个正整数 k , w k,w k,w 用一个空格隔开:

输出格式

一行一个个正整数,为所求的计算结果。
即满足条件的不同的 r r r 的个数(用十进制数表示),要求不得有前导零,各数字之间不得插入数字以外的其他字符(例如空格、换行符、逗号等)。

(提示:作为结果的正整数可能很大,但不会超过 200 200 200 位)

样例 #1

样例输入 #1

3 7

样例输出 #1

36

提示

【数据范围】
1 ≤ k ≤ 9 1\le k \le 9 1k9
1 ≤ w ≤ 3 × 1 0 4 1\le w \le 3\times 10^4 1w3×104

题目来源

NOIP 2006 提高组 第四题(洛谷)

题解

#include<bits/stdc++.h>
using namespace std;

// 比较两个高精度数a和b,a >= b返回1,否则返回0
inline bool comp(string a, string b) {
    if (a.size() < b.size())
        return 0;
    if (a.size() > b.size())
        return 1;
    for (int i = a.size() - 1; i >= 0; i--) {
        if (a[i] < b[i])
            return 0;
        if (a[i] > b[i])
            return 1;
    }
    return 1;
}

// 求两个高精度数a和b的和
inline string sum(string a, string b) {
    if (comp(a, b) == 0)
        swap(a, b);
    string c = "";
    char x[2] = "";
    bool n = 0;
    int bpt = b.size() - 1;
    for (int i = a.size() - 1; i >= 0; i--) {
        if (b[bpt] < '0' || b[bpt] > '9')
            b[bpt] = '0';
        x[0] = a[i] + b[bpt] - '0';
        if (n == 1) {
            x[0]++;
            n = 0;
        }
        if (x[0] > '9') {
            x[0] -= 10;
            n = 1;
        }
        c.insert(0, x);
        bpt--;
        if (bpt < 0) {
            bpt = 0;
            b[0] = '0';
        }
    }
    if (n == 1)
        c.insert(0, "1");
    while (c[0] == '0')
        c.erase(0, 1);
    if (c.size() == 0)
        c.insert(0, "0");
    return c;
}

// 求两个高精度数a和b的差(保证结果为正数)
string dif(string a, string b) {
    string c = "";
    char x[2] = "";
    bool n = 0;
    int bpt = b.size() - 1;
    for (int i = a.size() - 1; i >= 0; i--) {
        if (b[bpt] < '0' || b[bpt] > '9')
            b[bpt] = '0';
        x[0] = a[i] - b[bpt] + '0';
        if (n == 1) {
            x[0]--;
            n = 0;
        }
        if (x[0] < '0') {
            x[0] += 10;
            n = 1;
        }
        c.insert(0, x);
        bpt--;
        if (bpt < 0) {
            bpt = 0;
            b[0] = '0';
        }
    }
    while (c[0] == '0')
        c.erase(0, 1);
    if (c.size() == 0)
        c.insert(0, "0");
    return c;
}

// 求高精度数a与整型数b的积
string mul(string a, int b) {
    string c = "";
    char x[2] = "";
    int n = 0, y;
    for (int i = a.size() - 1; i >= 0; i--) {
        y = 0;
        if (n > 0)
            y = n;
        n = (a[i] - '0') * b + y;
        x[0] = n % 10 + '0';
        n /= 10;
        if (x[0] > '9') {
            x[0] -= 10;
            n++;
        }
        c.insert(0, x);
    }
    while (n > 0) {
        x[0] = n % 10 + '0';
        n /= 10;
        c.insert(0, x);
    }
    while (c[0] == '0')
        c.erase(0, 1);
    if (c.size() == 0)
        c.insert(0, "0");
    return c;
}

// 求高精度数a与整型数b的商
string div(string a, int b) {
    string c = "";
    char x[2] = "";
    int n = 0, y;
    for (int i = 0; i < a.size(); i++) {
        n *= 10;
        n += a[i] - '0';
        x[0] = n / b + '0';
        n %= b;
        c.insert(c.size(), x);
    }
    while (n > 0) {
        x[0] = n % 10 + '0';
        n /= 10;
        c.insert(0, x);
    }
    while (c[0] == '0')
        c.erase(0, 1);
    if (c.size() == 0)
        c.insert(0, "0");
    return c;
}

// 把整型数转化成高精度数
string change(int num) {
    if (num == 0)
        return "0";
    string a = "";
    char c[2] = "";
    while (num > 0) {
        c[0] = num % 10 + '0';
        num /= 10;
        a.insert(0, c);
    }
    return a;
}

// 覆盖(即用一个高精度数覆盖另一个高精度数)
void instead(string &s, string s0) {
    s.erase(0, s.size());
    s.insert(0, s0);
}

string c[50000];
const int power[10] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512 }; // 打表计算2^n

int main() {
    int k, w;
    cin >> k >> w;
    // 计算符合条件的两位数的数量
    c[2] = change((power[k] - 1) * (power[k] - 2) / 2);
    string ans = c[2];
    int most = min(w / k + (w % k == 0 ? 0 : 1), power[k] - 1); 
    // most存储max(max不能定义)
    for (int i = 3; i <= most; i++) {
        if ((power[k] - i) % i == 0)
            c[i].insert(0, mul(c[i - 1], (power[k] - i) / i));
        else
            c[i].insert(0, div(mul(c[i - 1], power[k] - i), i));
        ans = sum(ans, c[i]);
    }
    instead(c[most - 1], "1");
    int most2 = min(power[w % k] - 1, power[k] - most - 1);
    if (power[k] - most <= power[w % k] - 1 || most2 <= 0) {
        cout << ans;
        return 0;
    }
    // 特殊情况,如3 17,最大234567,上限6位3起,这时会误判
    ans = dif(ans, "1"); // 首位为max-1时要减掉
    for (int i = most; i < power[k] - 1 - most2; i++) {
        if (i % (i - most + 1) == 0)
            instead(c[i], mul(c[i - 1], i / (i - most + 1)));
        else
            instead(c[i], div(mul(c[i - 1], i), i - most + 1));
        ans = dif(ans, c[i]);
    }
    cout << ans;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1902947.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑色矩形块检测数据集VOC+YOLO格式2000张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2000 标注数量(xml文件个数)&#xff1a;2000 标注数量(txt文件个数)&#xff1a;2000 标注…

使用ifconfig命令获取当前服务器的内网IP地址

如何使用ifconfig命令获取当前服务器的内网IP地址呢&#xff1f; ifconfig eth0 | grep inet | awk {print $2}

Zookeeper分布式锁原理说明【简单易理解】

Zookeeper 非公平锁/公平锁/共享锁 。 1.zookeeper分布式锁加锁原理 如上实现方式在并发问题比较严重的情况下&#xff0c;性能会下降的比较厉害&#xff0c;主要原因是&#xff0c;所有的连接都在对同一个节点进行监听&#xff0c;当服务器检测到删除事件时&#xff0c;要通知…

2007-2022年 国内各上市公司绿色化转型数据.(Excel文件、dta文件、参考文献、计算方法与说明)

上市公司绿色化转型数据为研究者提供了评估企业在生态文明建设、循环经济和绿色管理方面表现的重要视角。以下是对中国各上市公司绿色化转型数据的介绍&#xff1a; 数据简介 定义&#xff1a;上市公司绿色化转型是指企业在发展模式上向可持续发展转变&#xff0c;实现资源节…

如何确保 PostgreSQL 在高并发写操作场景下的数据完整性?

文章目录 一、理解数据完整性二、高并发写操作带来的挑战三、解决方案&#xff08;一&#xff09;使用合适的事务隔离级别&#xff08;二&#xff09;使用合适的锁机制&#xff08;三&#xff09;处理死锁&#xff08;四&#xff09;使用索引和约束&#xff08;五&#xff09;批…

《linux系统内核设计与实现》-内核空间和用户空间的概念以及内核空间和用户空间的数据拷贝

1 内核空间和用户空间的概念 用户空间&#xff1a;0-3G 内核空间&#xff1a;3-4G PAGE_OFFSET配置用户空间和内核空间的界限 分离的原因&#xff1a; &#xff08;1&#xff09;处理器模式不同&#xff0c;权限不同 对于x86体系的cpu&#xff0c;用户空间代码运行在Ring3…

时间、查找、打包、行过滤与指令的运行——linux指令学习(二)

前言&#xff1a;本节内容标题虽然为指令&#xff0c;但是并不只是讲指令&#xff0c; 更多的是和指令相关的一些原理性的东西。 如果友友只想要查一查某个指令的用法&#xff0c; 很抱歉&#xff0c; 本节不是那种带有字典性质的文章。但是如果友友是想要来学习的&#xff0c;…

如何创建和规划 PMO 团队,并发挥其最大实际价值

在当今复杂多变的商业环境中&#xff0c;项目管理办公室&#xff08;PMO&#xff09;已成为许多组织中不可或缺的一部分。PMO 团队能够为企业的项目管理提供战略指导、资源协调、流程优化等支持&#xff0c;从而提升项目的成功率和组织的整体绩效。那么&#xff0c;如何创建和规…

【React】React18 Hooks 之 useReducer

目录 useReducer案例1&#xff1a;useReducer不带初始化函数案例2&#xff1a;useReducer带初始化函数注意事项1&#xff1a;dispatch函数不会改变正在运行的代码的状态注意事项2&#xff1a;获取dispatch函数触发后 JavaScript 变量的值注意事项3&#xff1a;触发了reducer&am…

【沐风老师】3DMAX样条线增强工具SplinePro使用方法详解

3DMAX样条线增强工具SplinePro使用教程 3DMAX样条线增强工具SplinePro&#xff0c;允许创建选定的多条样条曲线形状的轮廓并删除交叉点。 【适用版本】 3dMax2019 - 2025 【安装方法】 1.解压缩后&#xff0c;确认SplinePro-0.2.0.mse和logo.png两个文件在同一文件夹中。 2.…

移动校园(4):数据处理(sql server数据库)

昨天写入数据库后的数据 可以看到classname和timeandlocation有多个值&#xff0c;所以需要进行数据处理 let reawait req.app.locals.db.query(select distinct classname from courses)let data[]re.recordset.map((value)>{let namesvalue.classname.split(,)names.map(…

那你真的了解方法调用吗?

方法调用是不是很熟悉&#xff1f;那你真的了解它吗&#xff1f;今天就让我们来盘一下它。 首先大家要明确一个概念&#xff0c;此处的方法调用并不是方法中的代码被执行&#xff0c;而是要确定被调用方法的版本&#xff0c;即最终会调用哪一个方法。 之前我们了解到&#xff…

【Android】自定义换肤框架05之Skinner框架集成

引入依赖 api("io.github.hellogoogle2000:android-skinner:1.0.0")初始化Skinner 在所有功能前调用即可&#xff0c;建议在Application中初始化 SkinnerKit.init(application)安装皮肤包 在应用该皮肤包前安装即可&#xff0c;建议预安装&#xff0c;或应用皮肤…

【反悔堆 反悔贪心】2813. 子序列最大优雅度

本文涉及知识点 反悔堆 反悔贪心 LeetCode 2813. 子序列最大优雅度 给你一个长度为 n 的二维整数数组 items 和一个整数 k 。 items[i] [profiti, categoryi]&#xff0c;其中 profiti 和 categoryi 分别表示第 i 个项目的利润和类别。 现定义 items 的 子序列 的 优雅度 可…

如何在 PostgreSQL 中实现数据的增量备份和恢复?

文章目录 一、增量备份的原理二、准备工作&#xff08;一&#xff09;环境配置&#xff08;二&#xff09;创建测试数据库和表&#xff08;三&#xff09;插入初始数据 三、全量备份四、基于时间点的增量备份&#xff08;一&#xff09;开启 WAL 归档&#xff08;二&#xff09…

网页封装APP:让您的网站变身移动应用

网页封装APP&#xff1a;让您的网站变身移动应用 随着移动设备的普及&#xff0c;越来越多的人开始使用移动设备浏览网站。但是&#xff0c;传统的网站设计并不适合移动设备的屏幕尺寸和交互方式&#xff0c;这导致了用户体验不佳和流失。 有没有办法让您的网站变身移动应用&…

TXT文本处理新篇章:告别繁琐,一键批量删除单号间空白行,引领高效管理新潮流!

在繁忙的商务环境中&#xff0c;文本处理往往占据了大量的时间和精力。特别是那些充斥着订单、单号等关键信息的TXT文本文件&#xff0c;一旦处理不当&#xff0c;就可能引发一系列问题。空白行&#xff0c;这个看似微不足道的小细节&#xff0c;却常常成为我们高效处理文本的绊…

C++ | Leetcode C++题解之第220题存在重复元素III

题目&#xff1a; 题解&#xff1a; class Solution { public:int getID(int x, long w) {return x < 0 ? (x 1ll) / w - 1 : x / w;}bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {unordered_map<int, int> mp;int n nums.si…

python根据父母身高预测儿子身高

题目 从键盘输入父母的升高&#xff0c;并使用eval()或float()转换输入的数据类型。计算公式&#xff1a;儿子身高&#xff08;父亲身高母亲身高&#xff09;*0.54. father_heighteval(input(请输入爸爸的身高&#xff1a;)) mother_heighteval(input(请输入妈妈的身高&#…

普通Java工程如何在代码中引用docker-compose.yml中的environment值

文章目录 一、概述二、常规做法1. 数据库配置分离2. 代码引用配置3. 编写启动类4. 支持打包成可执行包5. 支持可执行包打包成docker镜像6. docker运行 三、存在问题分析四、改进措施1. 包含environment 变量的编排文件2. 修改读取配置文件方式3. 为什么可以这样做 五、运行效果…