ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

BZOJ-3834 [Poi2014]Solar Panels(数论分块)

2020-11-15 20:34:19  阅读:229  来源: 互联网

标签:3834 lfloor rfloor int long leq Poi2014 Solar lld


题目描述

  已知 \(A\leq x\leq B,C\leq y\leq D\),求 \(\gcd(x,y)\) 的最大值。

  数据范围:\(1\leq T\leq 1000,1\leq A\leq B\leq 10^9,1\leq C\leq D\leq 10^9\)。

分析

  考虑枚举 \(x,y\) 的公因子 \(d\)。

  首先可以发现一个性质:区间 \([l,r]\) 中有 \(d\) 的倍数的充要条件是 \(\lfloor\frac{l-1}{d}\rfloor<\lfloor\frac{r}{d}\rfloor\)。

  枚举 \(d\in [1,\min(B,D)]\),然后判断是否满足 \(\lfloor\frac{A-1}{d}\rfloor<\lfloor\frac{B}{d}\rfloor\) 且 \(\lfloor\frac{C-1}{d}\rfloor<\lfloor\frac{D}{d}\rfloor\)。可以发现 \(\lfloor\frac{D}{d}\rfloor\) 这种形式的式子可以分块算,最多只有 \(\sqrt{D}\) 种取值,每一块中 \(d\) 的最大值为 \(\min\Big(\Big\lfloor\frac{B}{\lfloor\frac{B}{l}\rfloor}\Big \rfloor,\Big\lfloor\frac{D}{\lfloor\frac{D}{l}\rfloor}\Big \rfloor\Big)\),因此分块枚举即可。

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        long long A,B,C,D,ans;
        scanf("%lld %lld %lld %lld",&A,&B,&C,&D);
        for(long long l=1,r;l<=B&&l<=D;l=r+1)
        {
            r=min(B/(B/l),D/(D/l));
            if( (A-1)/r<B/r and (C-1)/r<D/r)
                ans=r;
        }
        cout<<ans<<endl;
    }
}

标签:3834,lfloor,rfloor,int,long,leq,Poi2014,Solar,lld
来源: https://www.cnblogs.com/DestinHistoire/p/13978758.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有