• 【BZOJ4915】简单的数字题(数学)


    点此看题面

    • 任取四个互不相同的正整数组成一个集合({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倍的对数
    }
    
    
    败得义无反顾,弱得一无是处
  • 相关阅读:
    lsyncd实时同步搭建指南——取代rsync+inotify
    Linux内存管理
    [Python爬虫] 之十一:Selenium +phantomjs抓取活动行中会议活动信息
    [Python爬虫] 之十:Selenium +phantomjs抓取活动行中会议活动
    [Python爬虫] 之九:Selenium +phantomjs抓取活动行中会议活动(单线程抓取)
    python 正则表达式
    Scrapy 安装
    python 安装whl文件
    [Python爬虫] 之八:Selenium +phantomjs抓取微博数据
    [Python爬虫] 之七:selenium webdriver定位不到元素的五种原因及解决办法(转载)
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/BZOJ4915.html
Copyright © 2020-2023  润新知