Lucky Days -codeforce

题意

Lucky Days -codeforce_第1张图片

题解

线段\([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;
}

转载于:https://www.cnblogs.com/zgglj-com/p/9954788.html

你可能感兴趣的:(Lucky Days -codeforce)