题目链接

https://www.luogu.org/problem/P2022

题目描述

让我们来考虑1到N的正整数集合。让我们把集合中的元素按照字典序排列,例如当N=11时,其顺序应该为:1,10,11,2,3,4,5,6,7,8,9。

定义K在N个数中的位置为Q(N,K),例如Q(11,2)=4。现在给出整数K和M,要求找到最小的N,使得Q(N,K)=M。

输入格式

输入文件只有一行,是两个整数K和M。

输出格式

输出文件只有一行,是最小的N,如果不存在这样的N就输出0。


#include<bits/stdc++.h>
#include<math.h>
using namespace std;
int main()
{
long long k, m, i = 0, j, l = 0, a[30], b = 0, d, c, e, n = 0, aa = 0, bb;
cin >> k; //输入k
cin >> m; //输入m
c = k; //将k赋给c,不让k变化
while (c) //将k存到数组a[]里
{
a[i] = c % 10;
c = c / 10;
i++;
}
b = 0;
e = i;
d = e;
for (d; n <= i + 1; d--)
{
for (j = 1; j <= d; j++)
{
l = pow(10, j - 1) + l;
}
if (n == 0)
b = (a[i - 1 - n] - 1)*l + b;
else
b = a[i - 1 - n] * l + b;
n++;
l = 0;
}
b = b + i;//最小值为k时,k的排名
if (b == m) {
cout << k;
}
else if (m < b) { cout << 0; }
else
for (e = i;;e++)
{
bb = k * pow(10, e - i + 1) - pow(10, e) + aa;
if (m - b <= bb)
{
cout << setprecision(30) << m - b - 1 - aa + pow(10, e);
break;
}
aa = k * pow(10, e - i + 1) - pow(10, e) + aa;
}
return 0;
}

  

方法

先考虑当最大的整数为k时,k的位置。 代码如下:

for (d; n <= i + ; d--)
{
for (j = ; j <= d; j++)
{
l = pow(, j - ) + l;
}
if (n == )
b = (a[i - - n] - )*l + b;
else
b = a[i - - n] * l + b;
n++;
l = ;
}
b = b + i;//最小值为k时,k的排名

其中数组a[ ]里存着k

这段代码的讲解如下,为方便理解,令k=453,则有四种数字在k前边:

  • (1)首位以1、2、3开头的数字,个数为(1+10+100)×(4-1)
  • (2)首位为4的数,次位小于5的数,个数为(1+10)×(5-0)+1
  • (3)首位为4,次位为5,第3位小于3的数,个数为1×(3-0)
  • (4)首位或第二位与K相同,但总位数小于k。两个,分别为4、45

通过这种方法就求出来了最大值为k时的排名b。

  • 如果m=b,那显然最小值n=k;
  • 如果m<b,则不存在n,因为该组数的最小值肯定是>=k的。
  • 如果m>b,则一定存在n。

下面讨论m>b的情况。

分析易知,若m>b,则n的位数肯定大于k的位数。K=453有3位,分析知4位数里排在453前边的数字有:

  • 1000-1999,2000-2999,3000-3000,4000-4529

数字的数量 用代码表示为

*pow(,-+)-pow(,)
//pow(10,4-3+1)中的4代表4位数
3代表K的位数,pow(,)里的4代表4位数

  • (m-3位数字中k的排名)<4位数里排在453前边的数字个数时
  • 则所求数字n必然为四位数字,且n在1000-1999,2000-2999,3000-3000,4000-4529范围内
  • n=(m-3位数字中k的排名-1)+1000。 若
  • (m-3位数字中k的排名)>4位数里排在453前边的数字个数,则应继续判断(m-4位数字中k的排名)与5位数里排在453前边的数字个数大小,直到 (m-i位数字中453的排名)<与(i+1)位数里排在453前的数字量,此时即可得到所求的最小数字
  • n=(m-i位数字中453的排名-1)+pow(10, i);

以上就是这道题的题解

洛谷【P2022 有趣的数】 题解的更多相关文章

  1. 洛谷 P2022 有趣的数 解题报告

    P2022 有趣的数 题目描述 让我们来考虑1到N的正整数集合.让我们把集合中的元素按照字典序排列,例如当N=11时,其顺序应该为:1,10,11,2,3,4,5,6,7,8,9. 定义K在N个数中的 ...

  2. C++ 洛谷 P2657 [SCOI2009]windy数 题解

    P2657 [SCOI2009]windy数 同步数位DP 这题还是很简单的啦(差点没做出来 个位打表大佬请离开(包括记搜),我这里讲的是DP!!! 首先Cal(b+1)-Cal(a),大家都懂吧(算 ...

  3. 洛谷 P1004 方格取数 题解

    P1004 方格取数 题目描述 设有 \(N \times N\) 的方格图 \((N \le 9)\),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字\(0\).如下图所示(见样例): ...

  4. 洛谷P2657 [SCOI2009]windy数 题解 数位DP

    题目链接:https://www.luogu.com.cn/problem/P2657 题目大意:找区间 \([A,B]\) 范围内 不含前导零 且 相邻两个数字之差至少为2 的正整数的个数. 题目分 ...

  5. P2022 有趣的数

    P2022 有趣的数 题目描述 让我们来考虑1到N的正整数集合.让我们把集合中的元素按照字典序排列,例如当N=11时,其顺序应该为:1,10,11,2,3,4,5,6,7,8,9. 定义K在N个数中的 ...

  6. 洛谷P1783 海滩防御 分析+题解代码

    洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...

  7. 洛谷P4047 [JSOI2010]部落划分题解

    洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...

  8. 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)

    洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...

  9. 【洛谷P2022】有趣的数

    有趣的数 题目链接 首先求出1~k中有多少个在k前面的数的个数,若>m,则无解 比如12345,从第一位开始, 1 0~1 共2个 1-0+1 12  10~12共3个    12-10+1 1 ...

  10. 洛谷10月月赛II题解

    [咻咻咻] (https://www.luogu.org/contestnew/show/11616) 令人窒息的洛谷月赛,即将参加NOIp的我竟然只会一道题(也可以说一道也不会),最终145的我只能 ...

随机推荐

  1. 《Python学习手册 第五版》 -第4章 介绍Python对象类型

    本章的内容主要是介绍了Python的核心对象类型,后续的5.6.7.8.9章针对这些核心类型分别展开详细的说明 本章我认为重要的有几点 1.作者有谈到Python的知识结构,这个我感觉是一个大框架,可 ...

  2. mybaits分页插件的使用

    1.导入依赖坐标 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>p ...

  3. TTStand 基础知识[8] Build-In StepTypes(3)

    Build-In Step Types的最后一篇,前面两篇的连接如下: TestStand 基础知识[7] Build-In StepTypes(2) TestStand 基础知识[6] Build- ...

  4. eclipse里新建work set,将项目分组放在不同文件夹

    想必大家的Eclipse里也会有这么多得工程...... 每次工作使用到的项目肯定不会太多...... 每次从这么大数量的工程当中找到自己要使用的, 必须大规模的滚动滚动条......有点不和谐了. ...

  5. Burpsuite--安装和环境配置

    1.引子 Burpsuite是一款安全人员常用的工具.在渗透测试中,我们使用Burp Suite将使得测试工作变得更加容易和方便,即使在不需要娴熟的技巧的情况下,只有我们熟悉Burp Suite的使用 ...

  6. nginX 安装 启动

    选择源码安装  下载安装包  nginx-1.8.0.tar.gz   解压                     tar -zxvf  nginx-1.8.0.tar.gz    进入文件夹   ...

  7. Linux ftp VSftp

    一.Linux FTP服务器分类: <1>wu-ftp <2>proftp=profession ftp <3>vsftp=very security ftp  本 ...

  8. UWP App国际化的两种实现

    开发App,我们都会标配简体中文和英文两种语言.至于你加多少种,取决于你的客户市场.无论如何,英语是必不可少的. UWP平台里面,微软也提供了一种默认的国际化方案,即修改Resources.resw资 ...

  9. Jmeter后置处理器,正则表达式提取器的使用

    [使用场景]:下一个请求参数需要从上一个请求的响应数据中获取 [jmeter正则表达式说明]:使用perl正则表达式(可参考:http://www.runoob.com/perl/perl-regul ...

  10. MFC/QT 学习笔记(三)——MFC模板创建

    新建项目->MFC模板->MFC应用程序->应用程序类型:单个文档:项目样式:MFC 标准->下一步...OK 此时点击运行,可直接弹出窗口. 调整 视图->类视图: · ...