SECHS
题目描述
对于给定的正整数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的更多相关文章
- 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 ...
- 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 ...
- 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 ...
- Rechnernetz
1.Der Aufbau des Internets 1.1 Randabschnitt Er besteht aus Rechner,der mit Internet verbunden ist.D ...
随机推荐
- 关于listview的一些属性
由于这两天在做listView的东西,所以整理出来一些我个人认为比较特别的属性,通过设置这样的属性可以做出更加美观的列表 首先是stackFromBottom属性,这只该属性之后你做好的列表就会显示你 ...
- 2,SFDC 管理员篇 - 组织架构
1,组织架构 Setup | Administrator | Manage User| Role 组织层级有三种模式,基于区域划分,基于产品划分,基于公司规模划分层级(目标客户群体划分层级或渠道划分) ...
- MVC4.0中项目发布遇到IE11时session存入URL中,导致记不住密码的问题
///MVC4.0中项目发布遇到IE11时session存入URL中,导致记不住密码的问题,在webconfig中配置<system.web><authentication mode ...
- avalon2学习教程15指令总结
avalon的指令在上一节已经全部介绍完毕,当然有的语焉不详,如ms-js.本节主要总结我对这方面的思考与探索. MVVM的成功很大一语分是来自于其指令,或叫绑定.让操作视图的功能交由形形式式的指令来 ...
- tdd 和 make file,以及cygwin
等我把这本书看完,好好总结一下. 还要把以前的博客文字整理一下
- CRC
#define POLY 0x1021 /** * Calculating CRC-16 in 'C' * @para addr, start of data * @para num, length ...
- 三天没有写题了,罪过!--Hash Table Start
(1)Island Perimeter 解题思路: 在矩阵上循环并记录岛(1)的个数;如果当前节点是岛,则检查其是否具有任何右邻居或下邻居,有的话邻居计数加1 ;岛的周长结果为islands * 4 ...
- 企业好助手U-Mail邮件服务器软件
对于一家企业,最核心的是什么?有人说人才,有人说技术,也有人说是数据(信息),依小编来 看,这些答案都没错,人才会流动,技术在不断更新,唯有数据(信息),日积月累,将沉淀为公司历史的一部分,作为决策的 ...
- JS复习
一.三个对话框1.alert("")警告对话框2.confirm("")确定对话框3.prompt("","")可输入内 ...
- 设置input 内容居中显示 .
text-align:center 水平居中显示 <style type="text/css"> input.text{text-align:center;paddi ...