专栏文章

题解:P14304 【MX-J27-T1】分块

P14304题解参与者 15已保存评论 15

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
15 条
当前快照
1 份
快照标识符
@mini0cpp
此快照首次捕获于
2025/12/02 02:44
3 个月前
此快照最后确认于
2025/12/02 02:44
3 个月前
查看原文

A. 分块

题意

给定 nn,询问有多少个 1xn1\leq x\leq n 满足 x\lfloor\sqrt{x}\rfloorxx 的因子。
qq 次询问,1n10181\leq n\leq 10^{18}1q1051\leq q\leq 10^5

部分分 40

对于一次询问,我们肯定可以直接暴力遍历所有的 1xn1\leq x\leq n 进行判断。
可以预处理,先把 1110610^6 都扫一遍,然后可以知道每个 1n1061\leq n\leq 10^6 的答案。
把答案存下来,每次询问即可 O(1)\mathcal O(1) 回答。
时间复杂度 O(n+q)\mathcal O(n+q)

部分分 50

这一档分虽然 O(n)\mathcal O(n) 做不了了,但是 O(n)\mathcal O(\sqrt n) 是可行的。
k=xk=\lfloor\sqrt{x}\rfloor,我们可以枚举 kk
对于一个 kk,考虑它会给哪些 xx 产生贡献。
注意到一定是形如 x=k(k+c)x=k(k+c) 的形式才会被 kk 带来贡献。
具体的,由于 k(k+3)=k2+3kk(k+3)=k^2+3k(k+1)2=k2+2k+1(k+1)^2=k^2+2k+1,因为有 k1k\geq 1 所以 k(k+3)(k+1)2k(k+3)\geq (k+1)^2
也就是说,k(k+3)k\lfloor\sqrt{k(k+3)}\rfloor\neq k
因此,枚举 kk,计算多少个 x=k2,x=k(k+1),x=k(k+2)x=k^2,x=k(k+1),x=k(k+2)[1,n][1,n] 之间。
时间复杂度 O(qn)\mathcal O(q\sqrt n)

满分 100

50 分的做法,存在一个关键性质:只有 x=k2,x=k(k+1),x=k(k+2)x=k^2,x=k(k+1),x=k(k+2) 这三类形式的 xx
而显然,如果存在 x=k2x=k^2,则 [1,n][1,n] 一定存在 x=(k1)2x=(k-1)^2。其他两种同理。
因此,我们只关心最大的 x=k2x=k^2kk 是多少。剩下的 1kk1\leq k'\leq k 都一定合法。
直接计算 m=nm=\sqrt{n},则形如 x=k2x=k^2 的有 mm 个。
同理可以计算出 x=k(k+1)x=k(k+1)x=k(k+2)x=k(k+2) 形式的数的个数。
具体实现在 mm 周围往下枚举若干个,即可知道精确的 x=k(k+1)x=k(k+1) 的数的个数,或使用二分搜索同理。
实现的时候,如果需要开根号,想要调用 sqrt(n)\textcolor{blue}{\texttt{sqrt(n)}},需要注意,对于 long long\textcolor{blue}{\texttt{long long}} 类型应该使用 sqrtl(n)\textcolor{blue}{\texttt{sqrtl(n)}},否则会产生精度误差导致挂分。这是因为 sqrt()\textcolor{blue}{\texttt{sqrt()}} 只在 double\textcolor{blue}{\texttt{double}} 精度范围内,而 sqrtl()\textcolor{blue}{\texttt{sqrtl()}}long double\textcolor{blue}{\texttt{long double}} 精度范围内。double\textcolor{blue}{\texttt{double}} 的精度范围内无法精确表示 long long\textcolor{blue}{\texttt{long long}} 类型。
依据实现时间复杂度为 O(q)\mathcal O(q)O(qlogn)\mathcal O(q\log n)

评论

15 条评论,欢迎与作者交流。

正在加载评论...