BZOJ-3834 [Poi2014]Solar Panels(數論分塊)
阿新 • • 發佈:2020-11-15
題目描述
已知 \(A\leq x\leq B,C\leq y\leq D\),求 \(\gcd(x,y)\) 的最大值。
資料範圍:\(1\leq T\leq 1000,1\leq A\leq B\leq 10^9,1\leq C\leq D\leq 10^9\)。
分析
考慮列舉 \(x,y\) 的公因子 \(d\)。
首先可以發現一個性質:區間 \([l,r]\) 中有 \(d\) 的倍數的充要條件是 \(\lfloor\frac{l-1}{d}\rfloor<\lfloor\frac{r}{d}\rfloor\)。
列舉 \(d\in [1,\min(B,D)]\),然後判斷是否滿足 \(\lfloor\frac{A-1}{d}\rfloor<\lfloor\frac{B}{d}\rfloor\)
程式碼
#include<bits/stdc++.h> using namespace std; int main() { int T; cin>>T; while(T--) { long long A,B,C,D,ans; scanf("%lld %lld %lld %lld",&A,&B,&C,&D); for(long long l=1,r;l<=B&&l<=D;l=r+1) { r=min(B/(B/l),D/(D/l)); if( (A-1)/r<B/r and (C-1)/r<D/r) ans=r; } cout<<ans<<endl; } }