【BZOJ4915】简单的数字题(数学)
- 任取四个互不相同的正整数组成一个集合\(\{a,b,c,d\}\),记其总和为\(S\)。
- 定义一个集合的强度,为从中选出两个不同的元素之和为\(S\)因数的方案数。
- 求所有可能集合中的最大强度,然后求出从\([l,r]\)中选择正整数组成集合达到最大强度的方案数。
- \(l\le r\le 10^{18}\)
第一问的答案
样例已经告诉了我们答案就是4。
假设\(a\le b\le c\le d\),则一对数的和是总和的因数,等价于这对数的和是剩余两数的和的因数。
而一个数\(x\)是另一个数\(y\)的因数,一个必要条件是\(x\le 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+2c\Leftrightarrow 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\{\lfloor\frac r{11}\rfloor-l+1,0\}+\max\{\lfloor\frac r{29}\rfloor-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\n%lld\n",max(r/11-l+1,0LL)+max(r/29-l+1,0LL)),0;//计算能满足11倍或29倍的对数
}
待到再迷茫时回头望,所有脚印会发出光芒