Codeforces Round 962 (Div. 3) D. Fun 题解

2 阅读1分钟

写在前面的话

想了一个小时,第一次写这种题,也算是学到了。可惜这个题本来不难的,没有写出来。但是觉得特别好,于是记下,希望对我和大家都有帮助!

题意

给你两个不等式:

{ab+ac+bcna+b+cx其中1a,b,c,x,n106(1) \begin{cases} a \ast b + a \ast c + b \ast c \leq n \\ \tag1 a + b + c \leq x \end{cases} 其中 1 \leq a , b , c , x , n \leq 10 ^ 6

给出 x,nx , n 要求出符合不等式组的三元组(a,b,c)(a , b, c) , 其中(1,2,1),(1,1,2)(1 , 2 , 1) , (1 , 1 , 2) 不被认为是同一组解。 约束: 对于T组测试点满足 , 1i=1Txi,i=1Tni1061 \leq \sum_{i=1}^{T}x_i , \sum_{i=1}^{T}n_i \leq 10 ^ 6

思路

观察不等式 , 我们可以发现因为ac+ab+bca \ast c + a \ast b + b \ast c这种特殊结构 , 所以(1,2,1),(1,1,2)(1 , 2 , 1), (1 , 1 , 2) 结果相同 , 它们等价。 观察数据范围 ,10610 ^ 6 大概率是 O(n)O(n)O(nlogn)O(nlogn) 的做法合理. 观察到 3a+b+cx3 \leq a + b + c \leq x 这也是一个性质 , 但是貌似和解题没什么关系。 观察到 , 如果ab+ac+bcna \ast b + a \ast c + b \ast c \leq n 成立 ,那么 abna \ast b \leq n 也一定成立。假设我们现在枚举 a , 然后看看最多有多少合法的 b

结论:

  • 对于a\forall a 最多有 O(logn)O(logn) b 成立

那么我们只需要暴力枚举 a , b 即可 , 如果发现不等式不满足 ,直接放弃更大b的枚举。——因为两个不等式左边是单调的。 将不等式变形 , 所以答案是

a=1nb=1namin(naba+b,xab)(2) \sum_{a=1} ^{n} \sum_{b=1}^{\lfloor \frac{n}{a} \rfloor} min({\lfloor \frac{n - a \ast b}{a + b} \rfloor} , x - a - b) \tag2

因为C 最小取 1 , 我们只需要找到满足两个等式的C最大取多少将所有的a,ba , b 都枚举完 , 统计贡献即可。

时间复杂度证明

首先我们试着找到 b 最多枚举多少个 , 由上 abna \ast b \leq n

bna(3) b \leq \lfloor \frac{n}{a} \rfloor \tag3

我们知道 b 最多枚举 这么多 , 但是这不够显然! 我们可以尝试先暴力 , 枚举 a , b. 那么我们可以得到答案为以下等式:

a=1ab=1na((ab+bc+ac)n&&(a+b+c)x)其中表达式成立结果为1,否则为0.(4) \sum_{a=1}^a\sum_{b=1}^{\lfloor \frac{n}{a} \rfloor} ((a * b + b * c + a * c) \leq n \&\& (a + b + c) \leq x) \tag4 其中表达式成立结果为 1 , 否则为 0 .

Note: 为了保证取到最多的b使得上式尽量成立 , 我们取 C:=CminC := C_{min} 即 1。 我们可以通过放缩得到下式:

a=1ab=1na((ab+bc+ac)n&&(a+b+c)x)a=1ana(5)\sum_{a=1}^a\sum_{b=1}^{\lfloor \frac{n}{a} \rfloor} ((a * b + b * c + a * c) \leq n \&\& (a + b + c) \leq x) \leq \sum_{a=1}^a \ast {\lfloor \frac{n}{a} \rfloor} \tag5
a=1anana=1n1a(6)\sum_{a=1}^a \ast {\lfloor \frac{n}{a} \rfloor} \leq n * \sum_{a=1}^n \frac{1}{a} \tag6
a=1n1a=1+(lnnln2)(7) \sum_{a=1}^n \frac{1}{a} = 1 + (ln^n - ln^2) \tag7

对于右边的等式我们发现是一个调和级数 对于a\forall a, 我们最多可以取到O(logn)O(logn)个b , 所以最后的时间复杂度是 O(nlogn)O(nlogn)的。

至此,证毕!

后文

如有任何错误和建议,请在评论区指出!