- 任取四个互不相同的正整数组成一个集合({a,b,c,d}),记其总和为(S)。
- 定义一个集合的强度,为从中选出两个不同的元素之和为(S)因数的方案数。
- 求所有可能集合中的最大强度,然后求出从([l,r])中选择正整数组成集合达到最大强度的方案数。
- (lle rle 10^{18})
第一问的答案
样例已经告诉了我们答案就是4。
假设(ale ble cle d),则一对数的和是总和的因数,等价于这对数的和是剩余两数的和的因数。
而一个数(x)是另一个数(y)的因数,一个必要条件是(xle y)。
所以说,可能的选法只有((a,b),(a,c),(a,d),(b,c))四种,当四种全部达成的时候就是答案(4)。
第二问的答案
四种全部满足,必须要满足((a+d)|(b+c))且((b+c)|(a+d)),因此(a+d=b+c),即(d=b+c-a)。
这样一来,考虑到(a+c<b+d),且(b+d=2b+c-a<3c<3(a+c)),因此(b+d=2(a+c))。
结合上(d=b+c-a),进一步可以得到(2b+c-a=2a+2cLeftrightarrow c=2b-3a)。
再考虑到((a+b)|(c+d)),也就是说((a+b)|(5b-7a)),显然(5b-7a<5(a+b)),剩余情况直接分类讨论:
- (5b-7a=2(a+b)Leftrightarrow b=3a),此时(c=3a,d=5a),(b=c)出错。
- (5b-7a=3(a+b)Leftrightarrow b=5a),此时(c=7a,d=11a),可以作为一组解。
- (5b-7a=4(a+b)Leftrightarrow b=11a),此时(c=19a,d=29a),可以作为一组解。
然后就发现样例已经包含了全部两种可能的情况,可谓无比良心。
因此我们只要判断([l,r])中有多少对数能满足(11)倍或(29)倍的关系(因为(b,c)在(a,d)中间,只需考虑(a,d)能否取到即可),最终得到答案为:
[max{lfloorfrac r{11}
floor-l+1,0}+max{lfloorfrac r{29}
floor-l+1,0}
]
代码:(O(1))
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define LL long long
using namespace std;
int main()
{
LL l,r;return scanf("%lld%lld",&l,&r),printf("4
%lld
",max(r/11-l+1,0LL)+max(r/29-l+1,0LL)),0;//计算能满足11倍或29倍的对数
}