【洛谷3579】[POI2014] PAN-Solar Panels(除法分块水题)
- 求所有\(x\in [a,b],y\in[c,d]\)中\(gcd(x,y)\)的最大值。
- \(a\le b\le10^9,c\le d\le 10^9\)
除法分块
考虑一个因数\(g\)出现在\([a,b]\)中,只要找到小于等于\(b\)的最小的\(d\)的倍数\(\lfloor\frac bg\rfloor\times g\),将它与\(a\)比较即可。
发现\(\lfloor\frac bg\rfloor\)是一个整除的形式,且\(\lfloor\frac bg\rfloor\)相同的时候更大的\(g\)肯定更有可能满足条件。
因此我们对于\(\lfloor\frac bg\rfloor\)和\(\lfloor\frac dg\rfloor\)一起除法分块,就解决了这道题。
代码:\(O(T\sqrt 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\n",t);
}return 0;
}
待到再迷茫时回头望,所有脚印会发出光芒