- 求所有(xin [a,b],yin[c,d])中(gcd(x,y))的最大值。
- (ale ble10^9,cle dle 10^9)
除法分块
考虑一个因数(g)出现在([a,b])中,只要找到小于等于(b)的最小的(d)的倍数(lfloorfrac bg floor imes g),将它与(a)比较即可。
发现(lfloorfrac bg floor)是一个整除的形式,且(lfloorfrac bg floor)相同的时候更大的(g)肯定更有可能满足条件。
因此我们对于(lfloorfrac bg floor)和(lfloorfrac dg floor)一起除法分块,就解决了这道题。
代码:(O(Tsqrt V))
#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
using namespace std;
int a,b,c,d;
int main()
{
RI Tt,i,l,r,t=0;scanf("%d",&Tt);W(Tt--)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
for(t=0,l=1;l<=min(b,d);l=r+1) r=min(b/(b/l),d/(d/l)),b/r*r>=a&&d/r*r>=c&&(t=r);//除法分块
printf("%d
",t);
}return 0;
}