写在前面的话
想了一个小时,第一次写这种题,也算是学到了。可惜这个题本来不难的,没有写出来。但是觉得特别好,于是记下,希望对我和大家都有帮助!
题意
给你两个不等式:
{a∗b+a∗c+b∗c≤na+b+c≤x其中1≤a,b,c,x,n≤106(1)
给出 x,n 要求出符合不等式组的三元组(a,b,c) , 其中(1,2,1),(1,1,2)不被认为是同一组解。
约束: 对于T组测试点满足 , 1≤∑i=1Txi,∑i=1Tni≤106
思路
观察不等式 , 我们可以发现因为a∗c+a∗b+b∗c这种特殊结构 , 所以(1,2,1),(1,1,2) 结果相同 , 它们等价。
观察数据范围 ,106 大概率是 O(n) 到 O(nlogn) 的做法合理.
观察到 3≤a+b+c≤x 这也是一个性质 , 但是貌似和解题没什么关系。
观察到 , 如果a∗b+a∗c+b∗c≤n 成立 ,那么 a∗b≤n 也一定成立。假设我们现在枚举 a , 然后看看最多有多少合法的 b。
结论:
- 对于∀a 最多有 O(logn) b 成立
那么我们只需要暴力枚举 a , b 即可 , 如果发现不等式不满足 ,直接放弃更大b的枚举。——因为两个不等式左边是单调的。
将不等式变形 , 所以答案是
a=1∑nb=1∑⌊an⌋min(⌊a+bn−a∗b⌋,x−a−b)(2)
因为C 最小取 1 , 我们只需要找到满足两个等式的C最大取多少。将所有的a,b 都枚举完 , 统计贡献即可。
时间复杂度证明
首先我们试着找到 b 最多枚举多少个 , 由上 a∗b≤n
b≤⌊an⌋(3)
我们知道 b 最多枚举 这么多 , 但是这不够显然!
我们可以尝试先暴力 , 枚举 a , b.
那么我们可以得到答案为以下等式:
a=1∑ab=1∑⌊an⌋((a∗b+b∗c+a∗c)≤n&&(a+b+c)≤x)其中表达式成立结果为1,否则为0.(4)
Note: 为了保证取到最多的b使得上式尽量成立 , 我们取 C:=Cmin 即 1。
我们可以通过放缩得到下式:
a=1∑ab=1∑⌊an⌋((a∗b+b∗c+a∗c)≤n&&(a+b+c)≤x)≤a=1∑a∗⌊an⌋(5)
a=1∑a∗⌊an⌋≤n∗a=1∑na1(6)
a=1∑na1=1+(lnn−ln2)(7)
对于右边的等式我们发现是一个调和级数 对于∀a, 我们最多可以取到O(logn)个b , 所以最后的时间复杂度是
O(nlogn)的。
至此,证毕!
后文
如有任何错误和建议,请在评论区指出!