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 ...
随机推荐
- VBA_Excel_教程:变量,数组
Sub testVar() '变量 Dim strT1 As String strT1 = "A" '常量[加不加类型都可以] Const strT2 As String = &q ...
- 碎片事物的提交 commitAllowingStateLoss()
转:http://blog.csdn.net/kaiqiangzhang001/article/details/42241441 下边两个问题,是在开发中碰到的一些关于Fragment的偶发性的问题, ...
- 云主机不能外网ssh连接,只能内网ssh连接的问题处理
某台服务器外网无法ssh,内网可以ssh连接,ping值延时比较大 安装iftop查看流量 yum install -y iftop iftop界面含义如下 第一行:带宽显示 中间部分:外部连接列表, ...
- JStorm注意事项
storm.yaml的配置可以参照defaults.yaml,例如: nimbus.childopts: " -Xms256m -Xmx256m -XX:+UseConcMarkSweepG ...
- Func的介绍
经常看到 Func<int, bool>...这样的写法,看到这样的就没有心思看下去了.我们学技术还是需要静下心来. 对Func<int,bool>的Func转到定义看它的解 ...
- Linux内核分析第四周学习总结:扒开系统调用的三层皮(上)
韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.用户态.内核 ...
- sql中 查询条件出现单引号和特殊字符处理
1.两个单引号转为一个单引号 example: select * from tb where name=' '' ' 2.如果出现 "_","%" 需要用 ...
- expecting SSH2_MSG_KEX_ECDH_REPLY ssh_dispatch_run_fatal问题解决
设置client的mtu ifconfig eth0 mtu 576 Ultimately, I added the following to /etc/ssh/ssh_config: Host * ...
- POJ 2010 - Moo University - Financial Aid 初探数据结构 二叉堆
考虑到数据结构短板严重,从计算几何换换口味= = 二叉堆 简介 堆总保持每个节点小于(大于)父亲节点.这样的堆被称作大根堆(小根堆). 顾名思义,大根堆的数根是堆内的最大元素. 堆的意义在于能快速O( ...
- css3的一些新属性1
<body> /*文本阴影*/ <h1 style="text-shaow:5px 5px 5px #C0F">我爱你</h1> </bo ...