题意
题解
线段\([l_a + kt_a, r_a + kt_a]\),\([l_b + kt_b,r_b + kt_b ]\)相交,可以建立一个不等式:
\[ l_b \leq y \leq r_b \]
\[ y \equiv l_a + kt_a (mod(t_b)) \]
转化一下:
\[ y = l_a + kt_a + ht_b \]
\(k,h\)都是变量,那么由欧几里得扩展可知:\(k,h\)存在时,\(gcd(t_a,t_b) | (y - l_a)\)。至此,问题转化为在区间\([l_b,r_b]\),寻找一个\(y\)值使得\(gcd(t_a,t_b)|(y - l_a)\)。如果是枚举区间内的数,复杂度会炸。稍微思考一下,不需要枚举整个区间的数,考察\(y = l_b\)和\(y = y',\frac{y' - l_a}{gcd(t_a,t_b)} = \frac{l_b - l_a}{gcd(t_a,t_b)} + 1\)。令\(t = \frac{l_b-l_a}{gcd(t_a,t_b)}\),那么可以解得:
\[ y = t * gcd(t_a,t_b) + l_a \]
\[ y' = (t + 1) * gcd(t_a,t_b) + la \]
代码
#include
using namespace std;
int la, ra, ta, lb, rb, tb;
int main()
{
cin >> la >> ra >> ta >> lb >> rb >> tb;
if (la > lb) {
swap(la, lb);
swap(ra, rb);
swap(ta, tb);
}
int g = __gcd(ta, tb);
int k = (lb - la) / g;
int l = ra - la;
int ans = 0;
ans = max(ans, min(la + g * k + l, rb) - max(la + g * k, lb) + 1);
k++;
ans = max(ans, min(la + g * k + l, rb) - max(la + g * k, lb) + 1);
cout << ans << endl;
return 0;
}