AGC040F Two Pieces 解题报告

AGC040F Two Pieces 解题报告:

题意

数轴上有两个棋子,初始都在 \(0\) 位置,进行 \(n\) 次操作,每次将一个棋子移动一步或者是把靠后的棋子移到靠前的棋子的位置,两个棋子无法区分,求最后两个棋子分别到 \(A,B\) 的方案数。

\(1\leqslant n\leqslant 10^7\)。

分析

orz p_b_p_b。

不妨令 \(1\) 为坐标较大的棋子,\(2\) 为另一个,令 \(A\geqslant B\)。

把 \(2\) 的坐标和 \(1\) 的坐标作为数对,看作二维平面上的一个点。我们画出直线 \(y=x\),那么让 \(1\) 走一步就是向右(记为操作 \(1\)),让 \(2\) 走一步就是向上(记为操作 \(2\)),让 \(2\) 跳到 \(2\) 就是跳到直线上(记为操作 \(3\)),且操作 \(2\) 不能碰触直线,最后要到达 \((A,B)\)。

操作 \(3\) 次数为 \(0\) 的时候很容易处理,类似卡特兰数折线法即可。

我们发现跳到直线上很难处理,我们将操作 \(3\) 转化成将直线移到当前位置上。记最后一次操作的坐标为 \((x_0,y_0)\),那么我们的终点就应该是 \((A,B-(x_0-y_0))\)。

但是还是很难考虑,我们考虑在确定了 \((x_0-y_0)\) 以及行走出来的格路之后,将操作 \(3\) 插入操作序列。观察可以得到,对于让直线变为 \(y=x-k\) 的操作 \(3\),它的插入位置一定只能是这个直线与格路的最后一个交点,于是插板法计算即可。

复杂度 \(O(n)\)。

代码

上一篇:002.add-two-numbers


下一篇:哪个品牌的眼科医院CRM软件好?