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

【洛谷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;
}
posted @ 2021-05-12 09:05  TheLostWeak  阅读(69)  评论(0编辑  收藏  举报