Lucky Days

较好观感

给定 l a , r a , t a , l b , r b , t b l_a,r_a,t_a,l_b,r_b,t_b la​,ra​,ta​,lb​,rb​,tb​,对于所有的非负整数 k k k,将区间 [ l a + k t a , r a + k t a ] [l_a+kt_a,r_a+kt_a] [la​+kta​,ra​+kta​] 打上标记 1 1 1,将区间 [ l b + k t b , r b + k t b ] [l_b+kt_b,r_b+kt_b] [lb​+ktb​,rb​+ktb​] 打上标记 2 2 2。求出最长的连续区间使得该区间中的所有位置都被同时打上的 1 , 2 1,2 1,2 标记。

样例一

0 2 5
1 3 5
2

样例二

0 1 3
2 3 6
1


思路

题目要求两个区间的重合度最大的长度。

首先第一个点我们要想到:要想使两个区间的重合度最高,需要让两个区间尽可能逼近。最优的情况就是两个区间的左端点尽可能相等,这样重合度是最大的。

即使 l a + x ∗ t a = l b + y ∗ t b la + x * ta = lb + y * tb la+x∗ta=lb+y∗tb

将式子进行移项得 x ∗ t a − y ∗ t b = l b − l a x * ta - y * tb = lb - la x∗ta−y∗tb=lb−la (此时我们假设 l a < l b la < lb la<lb,代码中已做相关的操作,这样只是为了方便)

我们需要看式子是否有解,式子结构和裴蜀定理比较像,拿出来进行对比。

裴蜀定理 : 存在整数 x , y x, y x,y,满足 a ∗ x + b ∗ y = g c d ( a , b ) a * x + b * y = gcd(a,b) a∗x+b∗y=gcd(a,b)

该式子进行 y y y符号变为正,表示 y y y是整数,则 x ∗ t a + y ∗ t b = l b − l a x * ta + y * tb = lb - la x∗ta+y∗tb=lb−la

我们令 d = g c d ( t a , t b ) d = gcd(ta, tb) d=gcd(ta,tb)

那么可以发现如果 d ∣ ( l b − l a ) d | (lb - la) d∣(lb−la),则该式子有解,左端点可以重合。


但是如果左端点不能重合怎么办,尽可能逼近就行。

此时别忘了式子右边的 l b − l a lb-la lb−la代表的是什么,是 区间a左端点移动的距离,那么因为 x ∗ t a + y ∗ t b = d x * ta + y * tb = d x∗ta+y∗tb=d是存在解的,则区间a移动的距离可进一步变为 d d d 。

注意:我说的区间a可以移动,是指的一定存在某种状态,上下两个人有两个区间的距离发生了变化,叫为区间移动更容易理解。如

t a = 3 , [ 1 , 4 ] − > [ 4 , 7 ] − > [ 7 , 10 ] − > [ 10 , 13 ] ta = 3,[1,4]->[4,7]->[7,10]->[10,13] ta=3,[1,4]−>[4,7]−>[7,10]−>[10,13]

t b = 4 , [ 3 , 5 ] − > [ 7 , 9 ] − > [ 11 , 13 ] tb = 4,[3,5]->[7,9]->[11,13] tb=4,[3,5]−>[7,9]−>[11,13]

[ 1 , 4 ] [ 3 , 5 ] [1,4][3,5] [1,4][3,5]左端点相差 2 2 2,这是一种区间状态,通过移动,会出现另一种区间状态 [ 10 , 13 ] [ 11 , 13 ] [10,13][11,13] [10,13][11,13]左端点相差 1 1 1。移动了一步( d = g c d ( 3 , 4 ) = 1 d = gcd(3,4) = 1 d=gcd(3,4)=1)

左端点不重合就尽可能逼近。

有两种状态可能是合适的。

d i s dis dis代表a区间左端点与b区间左端点相差的最小距离(a区间左端点我认为小于等于b区间左端点),即 d i s = ( l b − l a ) % d dis = (lb - la) \% d dis=(lb−la)%d

  • 区间a左端点移动到和区间b左端点相差 ( l b − l a ) % d (lb-la) \% d (lb−la)%d,可能是距离最近的

    • m i n ( r b − l b + 1 , r a − l a + 1 − d i s ) min(rb - lb + 1, ra - la + 1 - dis) min(rb−lb+1,ra−la+1−dis)
  • 然后是上面的情况在往后移一步,即区间a左端点超过区间b左端点 d − ( l b − l a ) d-(lb-la)%d d−(lb−la)

    • d i s = d − d i s dis = d - dis dis=d−dis
    • m i n ( r a − l a + 1 , r b − l b + 1 − d i s ) min(ra - la + 1, rb - lb + 1 - dis) min(ra−la+1,rb−lb+1−dis)

两个计算请画图领悟计算方法。

计算:左端点重合的情况可以合并在左端点能合并的代码里面,即左端点合并是左端点不合并的特殊情况。

代码

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int N = 1e5 + 5, mod = 1e9 + 7;// [l[a] + k * ta, r[a] + k * ta]
// 3 [1, 4] [4, 7] [7, 10] [10, 13] [13, 16] ---
// 4 [3, 5] [7, 9] [11, 13]         [15, 17] ---
// 起点尽可能相同
// 裴蜀定理:存在x,y 使 ax + by = gcd(a, b)
// la + x * ta = lb + y * tb
// x * ta - y * tb = lb - la
// gcd(ta, tb) | (lb - la)有解
// d = gcd(ta, tb) 看成相对移动的距离
// la -> la + d -> la + k * d    lb
// 差 = lb - la
// dis = (lb - la) % dvoid solve()
{int la, ra, ta, lb, rb, tb;cin >> la >> ra >> ta >> lb >> rb >> tb;if(la > lb){swap(la, lb);swap(ra, rb);swap(ta, tb);}int d = __gcd(ta, tb);int dis = (lb - la) % d; // 左端点的差int ans = 0;ans = max(ans, min(rb - lb + 1, ra - la + 1 - dis));dis = d - dis; // 向右移动一步ans = max(ans, min(ra - la + 1, rb - lb + 1 - dis));cout << ans << "\n";
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);int t;// cin >> t;t = 1;while(t--)solve();return 0;
}

【裴蜀定理】CF1055C Lucky Days相关推荐

  1. CF510D Fox And Jumping(动态规划转换为最短路,O(n^2×2^9) -> O(nlogn),裴蜀定理应用)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 以下内容摘自 我的文章:算法竞赛中的数论问题 - 数论全家桶(信奥 / 数竞 / ACM)作者孟繁宇, ...

  2. 【裴蜀定理】BZOJ 1441 MIN

    P4549 [模板]裴蜀定理 这是一道bzoj的权限题,同时又是一道luogu的模板题 在标题上写模板不是很好, 决定放bzoj的名字来撑撑场面 bzoj: 裴蜀定理:dalao题解 显然就很优秀ov ...

  3. BZOJ 2257: [Jsoi2009]瓶子和燃料【数论:裴蜀定理】

    2257: [Jsoi2009]瓶子和燃料 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1326  Solved: 815 [Submit][St ...

  4. bzoj 1441: Min 裴蜀定理

    题目: 给出\(n\)个数\((A_1, ... ,A_n)\)现求一组整数序列\((X_1, ... X_n)\)使得\(S=A_1*X_1+ ...+ A_n*X_n > 0\),且\(S\ ...

  5. Codeforces #499 E Border ( 裴蜀定理 )

    题目链接 题意 : 给出 N 种纸币.并且给出面值.每种纸币的数量可以任选.问你得出来的数在 k 进制下.末尾位的数有多少种可能.输出具体方案 分析 : 纸币任意选择组成的和 可以用一个一次多项式来表 ...

  6. [BZOJ 1441]Min(裴蜀定理)

    Description 给出n个数(A1...An)现求一组整数序列(X1...Xn)使得S=A1*X1+...An*Xn>0,且S的值最小 Solution 裴蜀定理: 显然gcd(a,b)| ...

  7. BZOJ2299 [HAOI2011]向量 【裴蜀定理】

    题目链接 BZOJ2299 题解 题意就是给我们四个方向的向量\((a,b),(b,a),(-a,b),(b,-a)\),求能否凑出\((x,y)\) 显然我们就可以得到一对四元方程组,用裴蜀定理判断 ...

  8. 牛客练习赛52 | C | [烹饪] (DP,裴蜀定理,gcd)

    牛客练习赛52 C 烹饪 链接:https://ac.nowcoder.com/acm/contest/1084/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 327 ...

  9. 【BZOJ-2299】向量 裴蜀定理 + 最大公约数

    2299: [HAOI2011]向量 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 1118  Solved: 488 [Submit][Statu ...

最新文章

  1. Debian 6.0 安装过程 及中文乱码
  2. DELL R740XD 开启 TPM功能
  3. 用费曼技巧自学编程,香不香?
  4. CodeForces - 103E Buying Sets(最小权闭合子图)
  5. Linux主机硬盘的主要规划
  6. webx学习(一)——初识webx
  7. apache禁止訪问某些文件或文件夹的方法
  8. php yii框架连接数据库,【PHP开发框架】yii框架怎样衔接数据库
  9. Ubuntu16.04上安装SU(Seismic Unix)的基本步骤
  10. 厚积薄发-Web安全
  11. 小米、QQ等8款手机浏览器发布自查整改公告;AMD宣布收购赛灵思;​TypeScript 4.0.5发布|极客头条
  12. 如何 Get 机器学习必备的算法技能? | 技术头条
  13. 一个非常好用的代理服务器软件AllegroSurf
  14. Java 抽象工厂模式(类图及实现)
  15. Web服务器常见HTTP错误码
  16. Microsoft C++ 异常: dlib::serialization_error,位于内存位置 0x0133F818 处
  17. java swing企业人事管理系统 java swing mysql实现的企业人事管理系统源码和导入文档(1013)
  18. SnakeGame(贪吃蛇游戏)
  19. html5捕鱼达人源码分享!!!
  20. OS学习笔记-9(清华大学慕课)页面置换算法

热门文章

  1. empty()与isEmpty(),空判断
  2. Linux perm
  3. UTF-8 vs GB18030,共存还是对抗?
  4. SVN使用教程:一:安装及使用
  5. android定位周边,Android 使用高德SDK编写周边搜索定位
  6. python打包whl文件
  7. 【学习笔记】JSP学习笔记(上)
  8. 打造心中的暗黑传奇3
  9. 电脑派位系统(新生入学摇号) v2016
  10. Cython(一)安装与使用