AtCoder Regular Contest 125
B - Squares
题意
给出一个 N,求有多少对 (x,y) 满足如下条件:
-
1⩽x,y⩽N。
-
x2−y 是一个平方数。(规定 0 也是平方数)
答案对 998244353 取模。
数据范围:N⩽1012
思路
设 x2−y=z2,(z∈Z⩾0),则 y=x2−z2=(x−z)(x+z)
令 p=(x−z),q=(x+z),则:
⎩⎪⎪⎨⎪⎪⎧1⩽pq⩽Np⩾q2p+q=x∈[1,N]
可以发现,q 的取值一共只有 N 种。
对于每一个 q 只用 O(1) 求出 p 即可。
不难发现,p 的取值只能为 q,q+2,q+4,…,min(⌊qN⌋,2N−q),
令 M=min(⌊qN⌋,2N−q),故一共有 ⌊2M−q⌋+1 种取值。
总复杂度 O(N)。
点击显/隐代码
C - LIS to Original Sequence
题意
给出 N,K 和一个长度为 K 的序列 A=(A1,A2,⋯,AK),求一个 1…N 的排列,使得序列 A 是该排列的一个最长上升子序列(LIS - longest increasing subsequence),并且要求排列的字典序最小。
输入保证 A 是一个严格单增序列。
数据范围:1⩽K⩽N⩽2×105
思路
考虑如何通过 A 来构造出一个排列 P,用 Pi 代表排列 P 中的第 i 个元素:
首先,当 K=1 时,Pi=(N,N−1,N−2,⋯,1)。
其次,当 K⩾2 时:
-
如果 A1=1,那么一定有 P1=A1=1,才能使得 P 的字典序最小,且一定能满足要求。
-
如果 A1⩾2,那么一定有 P1=A1,那么此时 P 中的数字1还没有使用过,如果我们令 P2=1 是不影响LIS的,因为题目只要求是LIS中一个即可,而且这样能使得字典序保持最小,所以有 P2=1。
- 证明:P1=A1。反设:若 P1<A1,那么最长上升子序列一定会比 A 多出一个元素,不满足题意;若 P1>A1,则不满足字典序最小这个条件,综上,P1=A1。
上面都只考虑了 A1,由于这个操作具有独立性,可以直接将 A1 删去,考虑后面的元素,每个元素都按照上述方式加入排列 P 中,只不过元素 1 的定义向右移了几位。
可以使用双指针模拟,i 指向 A 中元素,j 指向 P 中当前的 “1”(也就是当前能插入的最小的数字),保证不重复插入即可,如果枚举到了最后一个元素,按照 K=1 的情况处理即可。
总复杂度 O(N)。
点击显/隐代码