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 ...
随机推荐
- 学习了一下javascript的模块化编程
现在在我脑海里关于“模块化”的概念是这些词:简单.具有逻辑之美.易用.健壮.可扩展.似乎这些形容与我现在水平写出的代码有点格格不入啊. 所以今天想了解和简单的实践一下“模块化开发”. 1.首先学习一下 ...
- java测试题总结
1.Struts2处理来自多个页面的同一个Action请求,那么它们是不是同一个action. struts2中每个请求都是独立的.每一次请求都会去new一个新的action,所有写在action中的 ...
- log4j按级别输出日志文件
log4j.properties: BASE_DIR= /home/admin/preprocess-tmc-city/logs log4j.rootLogger=debug,stdout,debug ...
- Fragment一些问题
1.使用fragment静态加载,当需要替换的时候使用replace方式是无效的....... 2.replace的容器如果是线性布局,那么将会出现之前的页面残留的情况,正确做法是使用FrameLay ...
- php判断 !==false
测试 if($res !== false){ echo "未定义通过<br>"; }else{ echo "未定义不通过<br>"; } ...
- Angular $http解析通过接口获得的json数据
刚接触angular不久,对很多东西都不了解,今天需要用angular通过接口得到json数据,折腾了好久,总算是能获取到数据了,下面是部分源码,仅供参考: HTML部分: <body ng-a ...
- The prefix "context" for element "context:component-scan" is not bound.
在beans里面加上下面信息: xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLo ...
- ubuntu 14.04 更新 gcc/g++ 4.9.2
ubuntu 14.04 更新 gcc/g++ 4.9.2 最近看到c++11非常的好用,尤其是自带了regex,于是稍微学了一下c++11的新特性.可是我在编译一个regex程序是却发现稍微复杂一点 ...
- MapReudce中常见join的方案
两表join在业务开发中是经常用到,了解了大数据join的原理,对于开发有很大的好处. 1.reduce side join reduce side join是一种简单的join的方法,具体思想如下: ...
- 用BlendFunc实现舞台灯光和刮刮卡效果
[转]http://code.lovemiao.com/?p=136#more-136 之前写过一篇<不规则形状按钮的点击判定>,利用了CCRenderTexture创建一块画布,可以在上 ...