====== Quark Round 1 ====== ===== A ===== ==== 题意 ==== 给定 $n,m$ 求满足 $i+j=n$ 且 $\lfloor i/j\rfloor+\lceil j/i\rceil=m$ 的正整数对 $(i,j)$ 的对数。 有 $10^5$ 组数据。$n,m\leq 10^7$ 。 ==== 题解 ==== 将 $j=n-i$ 带入第二个式子后发现是先减后增的。在极值点两侧分别二分即可。 或者分别讨论 $i0$ ,$y>0$ 。这里 $x,y$ 为关于 $a,b$ 的一次多项式, $x>0$ ,$y>0$ 对应平面上的两条直线所夹的区域。故在经过一些操作之后仍可操作的向量,被夹在两条过原点的直线之间。若所有向量都不可操作,那么没有任何向量夹在这两条直线之间。将 $n$ 个二元组极角排序后,枚举相邻的二元组,表示最终的两条直线从他们之间穿过。问题便转化为两个向量的问题。 假设当前枚举的向量为 $\vec{v_1},\vec{v_2}$ ,前者极角序更小。 - 若 $\vec{v_1},\vec{v_2}$ 都位于直线 $y=x$ 上方,则执行操作一。 - 若 $\vec{v_1},\vec{v_2}$ 两个向量都位于直线 $y=x$ 下方,则执行操作二。 - 若 $\vec{v_1}$ 为于 $y=x$ 上方,$\vec{v_2}$ 位于 $y=x$ 下方,则取以下两者花费最小的: * 执行一次操作一,使 $\vec{v_2}$ 下方的向量变为不可操作。之后执行操作二,再执行若干次操作一,使 $\vec{v_1}$ 上方的向量不可操作。 * 先执行一次操作二,再执行一次操作一,使 $\vec{v_1}$ 上方的向量不可操作;之后执行一次操作二,再执行若干次操作一,使 $\vec{v_2}$ 下方的向量不可操作。 其中 1 和 2 为类似辗转相除的过程,3 只会执行一次。时间复杂度为 $O(n\log\min(a,b))$ 。