【洛谷3579】[POI2014] PAN-Solar Panels(除法分块水题)

点此看题面

  • 求所有(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;
}
败得义无反顾,弱得一无是处
原文地址:https://www.cnblogs.com/chenxiaoran666/p/Luogu3579.html