把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

【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倍的对数
}

posted @ 2021-05-23 14:35  TheLostWeak  阅读(31)  评论(0编辑  收藏  举报