题意
给出a,b,c,d,求最大的n满足存在a<=x<=b,c<=y<=d且gcd(x,y)=n
a,b,c,d<=1e9,T<=1000
分析
考虑枚举答案n,那么问题就转变成了是否满足 ⌊bn⌋>⌊a−1n⌋且⌊dn⌋>⌊c−1d⌋ ,那么只要分块即可。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
int a,b,c,d,mx,ans;
scanf("%d%d%d%d",&a,&b,&c,&d);
a--;c--;
mx=max(a,max(b,max(c,d)));
for (int i=1,last;i<=mx;i=last+1)
{
last=1e9;
if (a/i) last=min(last,a/(a/i));
if (b/i) last=min(last,b/(b/i));
if (c/i) last=min(last,c/(c/i));
if (d/i) last=min(last,d/(d/i));
if (b/i>a/i&&d/i>c/i) ans=last;
}
printf("%d\n",ans);
}
return 0;
}