zoukankan      html  css  js  c++  java
  • Lucky Days -codeforce

    题意

    题解

    线段([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 <bits/stdc++.h>
    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;
    }
    
  • 相关阅读:
    okhttp post用json传递参数
    android10获取相册图片
    从一页跳转到另一页返回后刷新
    获取应用图标并转为bitmap适配android10
    上拉更新,下拉刷新
    android 多图片上传
    04号团队-团队任务5:项目总结会
    codeforces987D bfs跑最短路
    layaair 物理
    TypeScript
  • 原文地址:https://www.cnblogs.com/zgglj-com/p/9954788.html
Copyright © 2011-2022 走看看