0%

Edu-CF-184-D1. Removal of a Sequence (Easy Version)(把找到剩余的第 k 个数字,转化为找到一个长度为 len 的初始序列,使得其剩余至少 k 个数字。)

题目大意

这是问题的简单版本。版本之间的区别在于xx的约束;在这个版本中,x105x \le 10^5

Polycarp有一个包含从11101210^{12}的所有自然数的序列。他决定通过执行以下操作$ x $次来修改这个序列:

  • 同时删除所有在位置yy2y2 \cdot y3y3 \cdot y,…,mynm \cdot y \le n的数字,其中$ n $是当前序列的长度。

之后,Polycarp想要在剩余序列中找到第$ k 个数字,或确定结果序列的长度小于个数字,或确定结果序列的长度小于 k $。

帮助Polycarp解决这个问题!

考虑一个例子。假设$ x = 2 y = 3 k = 5 $,那么:

image

红线划掉的数字在第一次操作后被删除,蓝线划掉的数字在第二次操作后被删除。因此,位置$ k = 5 处的数字是数字处的数字是数字 10 $。

思路讲解

二分答案。

思路参考了A_G 的代码

将这道题目转化为二分答案的关键,就在于把找到剩余的第 $ k $ 个数字,转化为找到一个长度为 lenlen 的初始序列,使得其剩余至少 kk 个数字,那么不难发现,最小的,符合我们的要求的 lenlen 就是答案。

那么,一次操作会减少多少个数字(长度为 lenlen 时)? 其实就是 leny\lfloor \frac{len}{y}\rfloor

因此,简单版本,检查函数也不难书写,直接模拟改过程即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
auto check=[&](ll len) {
ll cnt=1;
while (cnt<=X) {
if (len<=0) {
break;
}
len-=len/Y;
++cnt;
}
if (len>=K) {
return true;
}
return false;
};

AC代码

AC
https://codeforces.com/contest/2169/submission/360432707

心路历程(WA,TLE,MLE……)