题目描述

对于给定的正整数N,我们把[1, N]中的整数按照字符串的字典序排序得到N 项数列A(N)。

例如,N = 11的时候,A(N) = {1, 10, 11, 2, 3, 4, 5, 6, 7, 8, 9}。二元函数 Q(N, K)的定义域为N,

K∈Z+ 且 N≥K,其值为K 在A(N) 中的位置。例如从上面给出的A(11)中可以看出Q(11, 2) = 4。

现在你的任务是,对于给定的正整数 K 和M,求最小的正整数N 满足Q(N, K) = M。
输入格式
          仅有一行,包含两个正整数K 和M。
输出格式
          输出一个正整数N 表示答案。如果不存在这样的N,输出0。
样例输入 1
  12 7
样例输出1
  102
样例输入 2
  100000001 1000000000
样例输出2
  100000000888888879
数据范围与约定
  对于30% 的数据,满足M, K≤100。
  对于 100% 的数据,满足1≤M, K≤10^9。
乍一看.......没思路,但是好像是数学;
再乍......果然是数学,没思路(@_@);
先说一下,这道题最后是我看题解会的,这里就讲一下题解的思路(题解太简单了,简直虐尽天下像我一样的蒟蒻)

首先,先和大家普及一下有关字典序的知识,
对于数字n,它第一次出现在数列中时,它的位置的计算方法(以12345为例):
先拆位,将12345拆为(1),(12),(123),(1234),(12345)。
然后用每一位的数减去与其位数相等的最小数+1,为其在这一位上的位置
1——1 (1-1+1=1)
12——10 (12-10+1=3)
123——100 (123-100+1=24)
1234——1000 (1234-1000+1=235)
12345——10000 (12345-10000+1=2346)
最后,将得到的所有数加起来,得到 (1+3+24+235+2346=2609);
就是这个数第一次出现时他的位置(证明请看推导过程)
然后......在代码里讲吧

program ex02;
var ten:array[..] of int64;
m,k,p:int64;
procedure init; //读入,预处理
var i:longint;
begin
ten[]:=;
for i:= to do ten[i]:=ten[i-]*;
readln(m,k);
end; function rank(x:int64):int64; //求某数在数列中第一次出现的位置;(用上面公式)
var i:int64;
begin
i:=;
while ten[i]<=x do inc(i); //每一位分别处理,再依次相加;
exit(x-ten[i-]+);
end; function solve:int64;
var i,len,r,n:int64;
begin
n:=m; r:=;
while n> do //求输入的数在数列中第一次出现的位置;
begin
inc(r,rank(n));
n:=n div ;
end;
if r=k then exit(m); //正好相等,直接输出;
if r>k then exit(); //小,不可能达成;
len:=; n:=m;
while n> do //求位数
begin
inc(len);
n:=n div ;
end;
dec(k,r); i:=; //求中间差了几个数
while true do
begin
inc(i);
if k<=rank(ten[i]*m)- then exit(k+ten[i+len-]-); //关键的一步,,,卡了我好长时间,,,讲解在下面
dec(k,rank(ten[i]*m-));
end;
end; function check(m:int64):int64;
begin
check:=;
while m>= do
begin
if (m<>) and (m mod <>) then exit(-);
m:=m div ;
inc(check);
end;
end;
begin
assign(input,'sec.in'); reset(input);
assign(output,'sec.out')' rewrite(output);
init;
p:=check(m);
if (p>) then
begin
if (p=k) then
writeln(m)
else
writeln();
end
else
writeln(solve);
close(input);
close(output);
end.

key点:

我们知道要将这个题所求的范围置于某一特定的位数

那么,这个位数则么得到?

易得一点:1,10,100,1000,10000.....出现后,它们前面不会多出数字,那么,我们只需要知道rank(k*10^d)>m>rank(10^l) 的l的值

那么,m-rank(k)就是需要在k前面插入的数的个数

如果在 10^l~k*10^d中的数用不完就填满了,直接输出, 但如果不够,就将其扩大10倍,进行下面的操作,直到填完为止。

~\(≧▽≦)/~

SECHS的更多相关文章

  1. Also unsere eigene Christian Louboutin Webshop bietet die überragende Christian Louboutin Schuhe uk schiebt zusammen mit kostengünstigen Wert

    www.heelschuhe.de, Es ist wirklich eine der Frauen erfordern immer interessant und auch Louboutin Pu ...

  2. 2017 Multi-University Training Contest - Team 9 1002&&HDU 6162 Ch’s gift【树链部分+线段树】

    Ch’s gift Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  3. Gym 102056I - Misunderstood … Missing - [DP][The 2018 ICPC Asia-East Continent Final Problem I]

    题目链接:https://codeforces.com/gym/102056/problem/I Warm sunshine, cool wind and a fine day, while the ...

  4. Rechnernetz

    1.Der Aufbau des Internets 1.1 Randabschnitt Er besteht aus Rechner,der mit Internet verbunden ist.D ...

随机推荐

  1. 剑指Offer:面试题24——二叉搜索树的后序遍历序列(java实现)

    问题描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 思路: 1.首先后序遍历的结果是[(左子 ...

  2. (译)详解javascript立即执行函数表达式(IIFE)

    写在前面 这是一篇译文,原文:Immediately-Invoked Function Expression (IIFE) 原文是一篇很经典的讲解IIFE的文章,很适合收藏.本文虽然是译文,但是直译的 ...

  3. transition实现自定义tips淡入淡出效果

    transition实现动画的时候,只能实现指定属性的渐变,元素显隐要通过opacity来实现: 做了一个小的demo: <!doctype html> <html> < ...

  4. MySQL 批量插入 Update时Replace

    建一张试验表如下: 一.批量插入 MySQL的INSERT有一种写法如下: INSERT INTO person VALUES (NULL,'关羽', '2016-04-22 10:00:00'), ...

  5. Mybatis 插入null值报错

    解决方法: 1.在settings中配置 <setting name="jdbcTypeForNull" value="OTHER"/> MyBat ...

  6. 温习SQL server

    做了好几年的管理工作,技术上有些退步,现在又一一捡起来啦, 以下最近几天看到的好文章, SQL Server约束 http://blog.csdn.net/qq61394323/article/det ...

  7. cannot access the system temp folder

    cannot access the system temp folder. please, make sure your application have full control rights on ...

  8. Origin9.1如何绘制风向玫瑰图(Binned Data)?

    Origin9.1如何绘制风向玫瑰图(Binned Data)? 时间:2014/5/14 21:02:44 点击: 2624 核心提示:今天为大家介绍下如何使用Origin9.1绘制如下图所示的风向 ...

  9. crontab这个坑,执行单个命令执行成功,但是写到crontab怎么也不行

    昨天开始,一直在弄通过定时任务控制熄屏,在终端下的单个命令可以执行成功,写到脚本里,单个执行脚本能成功,但是写到crontab定时任务,怎么也不熄屏,但他确实执行了,看日志,是一直报错的:百度了很多很 ...

  10. linux系统man命令用法和安装方法

    Linux提供了丰富的帮助手册,当你需要查看某个命令的参数时不必到处上网查找,只要man一下即可. Linux的man手册共有以下几个章节: 代號 代表內容 1 使用者在shell中可以操作的指令或可 ...