每天一道C语言编程(2^k进制数)

题目描述

设r是个2^k 进制数,并满足以下条件:
(1)r至少是个2位的2^k 进制数。
(2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位。
(3)将r转换为2进制数q后,则q的总位数不超过w。
在这里,正整数k(1≤k≤9)和w(k〈w≤30000)是事先给定的。

问:满足上述条件的不同的r共有多少个?
我们再从另一角度作些解释:设S是长度为w 的01字符串(即字符串S由w个“0”或“1”组成),S对应于上述条件(3)中的q。将S从右起划分为若干个长度为k 的段,每段对应一位2^k进制的数,如果S至少可分成2段,则S所对应的二进制数又可以转换为上述的2^k 进制数r。
例:设k=3,w=7。则r是个八进制数(2^3=8)。由于w=7,长度为7的01字符串按3位一段分,可分为3段(即1,3,3,左边第一段只有一个二进制位),则满足条件的八进制数有:
2位数:高位为1:6个(即12,13,14,15,16,17),高位为2:5个,…,高位为6:1个(即67)。共6+5+…+1=21个
3位数:高位只能是1,第2位为2:5个(即123,124,125,126,127),第2位为3:4个,…,第2位为6:1个(即167)。共5+4+…+1=15个
所以,满足要求的r共有36个。

输入格式

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

输出格式

1行,是一个正整数,为所求的计算结果,即满足条件的不同的r的个数(用十进制数表示),要求最高位不得为0,各数字之间不得插入数字以外的其他字符(例如空格、换行符、逗号等)。
(提示:作为结果的正整数可能很大,但不会超过200位)

样例输入

3  7

样例输出

36

解题思路(这一题脑袋转不过来,分析了好久,现在分享一下思路)

例k=3,w=7

则2^k=8,8进制数,在八进制数中列出 转换为2进制后的位数 小于7位数的数

例如8进制的12,转换为2进制后为1010

满足条件

1.r至少是个2位的2^k 进制数,12是2位的8进制数

2.12的每一位严格小于它右边相邻的那一位

3.转换为2进制后1010的位数4<7

对于8进制而言,2进制每3位数表示1个8进制数

  

得出结论: 

● 要小于7位2进制数的话,8进制数的位数只能是2位和3位,把这一思路推广一下

● 除了首位以外,其他位的取值范围是000~111((2^k)-1),即每一位可以取0~7

●首位为0的情况下,可取w/k位,并且w/k>=2

●所以首位为0的合法解有

∑ C(2^k-1,i)(2<=i<=w/k)

即对于k=3,w=7的情况下,可取C(7,2),就是在1~7中选两个数都是合法的,那么有21种可能。为什么这21种解刚好符合题目例子(再看一遍题目,题目有例子喔)中2位数的合法解(21)呢?(只有严格递增的排列才是合法的)

 

●这里用的是C进行组合,从7个中选择2个,不可能有重复的两位数,并且排列并没有像A(排列)一样,(1,2):第一位是1,第二位是2(2,1)都取,这里我们默认只取(1,2),即严格递增的排列

●为什么没有(3,4)呢,因为(2<=i<=w/k)有限制

以上讨论了二进制首位为0的情况,接下来讨论二进制首位为1的情况

●如果首位非0,那么8进制数就是三位数

●除了首位外,还有w/k位,要符合严格递增的要求,首位的取值范围只能是1~2^(w%k)-1,例如

余下1位,那么只有0,1这两种可能,减去0这种可能就只有1种可能了

●设首位取值为val

●则剩下w/k位取值范围为val+1~(2^k)-1

●也就是有(2^k)-1-(val+1)+1个数,即2^k-1-val,按照首位为0来讨论,其合法解有

∑ C(2^k-1-val,w/k)(1<=val<=2^(w % k)-1)

用代码得出8进制数的最高位数      2<=n<=8进制数的最高位数

int Level(int k,int w)
{
    int n=0;
    while(w>0)
    {
        w-=k;
        n++;
    }
    return n;
}

重要注 (反复思考一下)

对于高精运算的处理,在网上学习到了一个比较巧妙的方法避开了复杂的数组运算,也可以有效避免溢出,就是把上面那些组合数的运算都转换成了 C(2^k-1,i) —(+1-i)—- > C(2^k-i,i),即写C组合函数的时候不是计算C(2^k-1,i),而是计算C(2^k-i+i-1,i),即我们把(2^k-i,i)代入函数得到的是(2^k-1,i)的结果,那么C(2^k-1,i) <—(-1+i)—-  C(2^k-i,i),就需要将C(n,m)的计算,变为C(n+m-1,m)

long sump(int n, int m)        //公式为C(n+m-1)(m)
{
    int i;
    long sum = 1;
    for(i = 0 ; i < m ; i++)
        sum *= (n+m-1-i);
    for(i = 1 ; i <= m ; i++)
        sum /= i;
        return sum;
}

sump(2^k-i,i)----->n=2^k-i,m=i------->C(2^k-1,i)

sump(sump( 2^k- w/k - i , w/k)----->n=2^k-w/k-i m=w/k------>C(2^k-i-1,w/k)

反过来如果我们要计算C(2^k-i-1,w/k),公式位C(n+m-1)(m),也可以得到n=2^k-w/k-i

最终代码为

#include<stdio.h>
#include<math.h>
long sump(int n, int m)        //公式为C(n+m-1)(m)
{
    int i;
    long sum = 1;
    for(i = 0 ; i < m ; i++)
        sum *= (n+m-1-i);
    for(i = 1 ; i <= m ; i++)
        sum /= i;
        return sum;
}

int Level(int k,int w)//计算最高有几位数
{
    int n=0;
    while(w>0)
    {
        w-=k;
        n++;
    }
    return n;
}

int main()
{
    int k ,w ,i ;
    scanf("%d%d",&k,&w);
    int level = Level(k,w);
    int max = pow( 2.0 , k);//这里的max是去不到的,例如k=3,2^3=8,8进制每一位最高111,就是7
    int gao = pow( 2.0, w%k)-1;//最高位的数的最大值,即val,可以取0,就是w/k能整除的情况
    
    //开始计算,分两种情况,第一种,首位为0,那么后面x位数对应的个数符合c[max-1][x]
    long long sum = 0;
    
    //去掉最高位 level-1;且至少两位i=2开始
    for(i = 2 ; i <= level - 1;i++)
        sum += sump( max - i,i);

    //第二种情况,首位不是0,如果首位为n,解就有C[max-1-n][w/k]
    for( i = 1 ; i <= gao ; i++)
        sum += sump( max - w/k - i , w/k);
        printf("%d\n",sum);
    return 0;
}

如果上面计算有点糊涂,可以直接根据公式来:

#include<stdio.h>
#include<math.h>
long sump(int n, int m)        //公式为C(n)(m)
{
    int i;
    long sum = 1;
    for(i = 0 ; i < m ; i++)
        sum *= (n-i);
    for(i = 1 ; i <= m ; i++)
        sum /= i;
    return sum;
}

int Level(int k,int w)//计算最高有几位数
{
    int n=0;
    while(w>0)
    {
        w-=k;
        n++;
    }
    return n;
}

int main()
{
    int k ,w ,i ;
    scanf("%d%d",&k,&w);
    int level = Level(k,w);
    int max = pow( 2.0 , k);//这里的max是去不到的,例如k=3,2^3=8,8进制每一位最高111,就是7
    int gao = pow( 2.0, w%k)-1;//最高位的数的最大值,即val,可以取0,就是w/k能整除的情况
    
    //开始计算,分两种情况,第一种,首位为0,那么后面x位数对应的个数符合c[max-1][x]
    long long sum = 0;

    
    for(i=2;i<=w/k;i++)
        sum+=sump(max-1,i);
    
    //第二种情况,首位不是0,如果首位为n,解就有C[max-1-n][w/k]
    for( i = 1 ; i <= gao ; i++)
        sum += sump(max-1-i, w/k);
    printf("%d\n",sum);
    return 0;
}

这一题主要是理解题意+分析,代码编写方面难度不大

既然提到了进制,顺便复习一下进制转换

编写一个程序,不使用格式控制符 %x 的情况下,将十进制数转换为十六进制

代码如下

#include <stdio.h>
#include <stdbool.h>


int main(void)
{
    int decimal;
    bool negative = false;
    
    printf("输入一个十进制数: ");
    scanf("%d", &decimal); 
    
    // 判断并记录要转换的十进制数的正负号
    if(decimal < 0)
    {
        negative = true;
        decimal *= -1;
    }
    
    // 将该十进制数对16进行短除法,并将余数依次存入数组num中
    int i;
    char hex[10];
    for(i=0; i<10 && decimal!=0; i++)
    {
        switch(decimal % 16)
        {
        case 0 ... 9:
            hex[i] = decimal%16 + '0';
            break;
        case 10 ... 15:
            hex[i] = decimal%16 - 10 + 'A';
            break;
        }
        decimal /= 16;
    }

    
    printf("转换成十六进制为: %c0x", negative?'-':' ');
    
    // 将数组num中的数字倒序输出
    int j;
    for(j=i-1; j>=0; j--)
    {
        printf("%c", hex[j]);
    }
    
    printf("\n");
    return 0;
}

结果展示

 今天的每日一题就到这里,如果有任何问题,请大佬们不吝赐教!💖💖💖

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据课程D2——hadoop的概述

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 了解hadoop的定义和特点&#xff1b; ⚪ 掌握hadoop的基础结构&#xff1b; ⚪ 掌握hadoop的常见命令&#xff1b; ⚪ 了解hadoop的执行流程&#xff1b; 一、简介 1…

《零基础入门学习Python》第057讲:论一只爬虫的自我修养5:正则表达式

如果你在课后有勤加练习&#xff0c;那么你对于字符串的查找应该是已经深恶痛绝了&#xff0c;你发现下载一个网页是很容易的&#xff0c;但是要在网页中查找到你需要的内容&#xff0c;那就是困难的&#xff0c;你发现字符串查找并没有你想象的那么简单&#xff0c;并不是说直…

【Matlab】基于粒子群优化算法优化BP神经网络的数据回归预测(Excel可直接替换数据)

【Matlab】基于粒子群优化算法优化 BP 神经网络的数据回归预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理2.数学公式3.文件结构4.Excel数据5.分块代码5.1 fun.m5.2 main.m 6.完整代码6.1 fun.m6.2 main.m 7.运行结果 1.模型原理 基于粒子群优化算法&#xff08;…

3个能免费使用的AI绘画软件,效果精致

通过AI绘画软件&#xff0c;设计小白也能轻松创作出精美的图画创作。本文将为大家介绍3款能免费使用的AI绘画软件&#xff0c;它们能帮助设计小白或者经验丰富的设计师快速设计出精美的图画作品&#xff0c;一起来看看吧&#xff01; 1、即时灵感 即时灵感是国产的AI绘画软件…

[JAVAee]synchronized关键字

目录 1.synchronized的特性 ①互斥性 ②可重入性 2.synchronized的使用示例 ①修饰普通方法 ②修饰静态方法 ③修饰代码块 1.synchronized的特性 ①互斥性 互斥性,就像是给门上锁了一样. 当A线程使用了被synchronized修饰的代码块并对其上锁,其他线程(B线程,C线程)想要使…

C. Maximum Set

Problem - 1796C - Codeforces 思路&#xff1a;这个题在做的时候基本的思路是对的&#xff0c;但是没有想到O(1)求答案&#xff0c;枚举的然后T了&#xff0c;我们能够知道&#xff0c;假设前面的数小&#xff0c;那么每个数一定是前面的倍数&#xff0c;所以至少乘以2&#x…

vue3.2 + elementPlus + Windi CSS + ts创建一个好用的可兼容不同宽高的login页面

1.效果预览 2. 代码准备 导入windiCSS&#xff1a; npm i -D vite-plugin-windicss windicss windiCSS官网&#xff1a; https://cn.windicss.org/integrations/vite.html 使用vite创建好你的vue工程 sass版本为&#xff1a; 1.49.9 3.Windi CSS在页面中使用 apply 二次定义类名…

AcWing 算法基础课二 数据结构 链表 栈 队列 并查集 哈希表

单链表. AcWing. 826.单链表 import java.util.Scanner; public class Main{static int[] e new int[100010];//结点i的值static int[] ne new int[100010];//结点i的next指针static int idx,head;//head是头结点&#xff0c;idx存当前已经用到了哪个点public static void i…

thinkphp6 验证码验证结果失败,可能是session开启位置错了!!!

搞了一下下午&#xff0c;始终提示验证码不正确 然后百度得到的结果都是&#xff1a;开启session&#xff0c;但是我开启了就是管用 <?php // 全局中间件定义文件 return [// 全局请求缓存// \think\middleware\CheckRequestCache::class,// 多语言加载// \think\middle…

【前端设计】使用Verdi查看波形时鼠标遮住了parameter值怎么整

盆友&#xff0c;你们在使用Verdi的时候&#xff0c;有没有遇到过鼠标遮挡着了parameter数值的场景&#xff1f;就跟下面这个示意图一样&#xff1a; 最可恨的是这个参数值他会跟着你的鼠标走&#xff0c;你想把鼠标移开看看看这个例化值到底是多大吧&#xff0c;这个数他跟着你…

单线程与多线程的理解与学习(入门到深入)

文章目录 一、在Java中&#xff0c;有多种方式可以创建线程。以下是几种常用的方法&#xff1a;二、线程的调度线程的调度分为两种调度模型分时调度模型抢占式调度模型 三、线程传值四、什么是线程同步五、线程安全六、线程的同步机制七、线程控制 一、在Java中&#xff0c;有多…

8.4Java EE——基于注解的AOP实现

Spring AOP的注解 元素 描述 Aspect 配置切面 Pointcut 配置切点 Before 配置前置通知 After 配置后置通知 Around 配置环绕方式 AfterReturning 配置返回通知 AfterThrowing 配置异常通知 下面通过一个案例演示基于注解的AOP的实现&#xff0c;案例具体实现…

全志F1C200S嵌入式驱动开发(调整cpu频率和dram频率)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 f1c200s默认的cpu频率是408M,默认的dram频率是156M。这两个数值,坦白说,都算不上特别高的频率。因为我们的晶振是24M输入,所以408/24=17,相当于整个cpu的频率只是晶振倍频了17…

node.js 爬虫图片下载

主程序文件 app.js 运行主程序前需要先安装使用到的模块&#xff1a; npm install superagent --save axios要安装指定版,安装最新版会报错&#xff1a;npm install axios0.19.2 --save const {default: axios} require(axios); const fs require(fs); const superagent r…

别在找git报错的解决方案啦,多达20条git错误解决方案助你学习工作

1. 找不到Git命令 $ sudo apt-get update $ sudo apt-get install git2. 无法克隆远程仓库 $ git clone https://github.com/username/repo.git3. 无法拉取或推送到远程仓库 $ git pull origin master $ git add . $ git commit -m "Resolve conflicts" $ git pus…

StableDiffusion 换脸实现

先看效果&#xff1a; 想要换的脸&#xff1a; 想要把脸放到的目标图片&#xff1a; 实现方案&#xff1a; StableDiffusionroop&#xff08;本次实验基于roopV0.02版本&#xff09; 1/安装SD&#xff0c;模型选择 DreamShaper,Sampler使用 Euler a 2/安装roop插件 roop插…

【隐式动态求解】使用非线性纽马克方法的隐式动态求解研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【ARM Coresight 系列文章 10.2 - ARM Coresight STM Trace packets】

文章目录 Trace protocolpacket的种类Error packetsVERSION Packets同步 packet 上篇文章&#xff1a;ARM Coresight 系列文章 10.1 - ARM Coresight STM 介绍及使用 下篇文章&#xff1a;ARM Coresight 系列文章 10.3 - ARM Coresight STM 寄存器介绍 及STM DMA 传输介绍 Trac…

【数据结构】树状数组和线段树

树状数组和线段树 下文为自己的题解总结&#xff0c;参考其他题解写成&#xff0c;取其精华&#xff0c;做以笔记&#xff0c;如有描述不清楚或者错误麻烦指正&#xff0c;不胜感激&#xff0c;不喜勿喷&#xff01; 树状数组 需求&#xff1a; 能够快速计算区间和保证在修改…

CSS背景虚化

.mark{background-color: rgba(0,0,0,.1);-webkit-backdrop-filter: blur(3px);backdrop-filter: blur(3px); }backdrop-filter CSS 属性可以让你为一个元素后面区域添加图形效果&#xff08;如模糊或颜色偏移&#xff09;。 因为它适用于元素背后的所有元素&#xff0c;为了看…