codeforces1055C Lucky Days

新博客在备案ing。

题目链接:https://codeforces.com/problemset/problem/1055/C

思路:首先想到的自然是,要让两个区间尽量靠近嘛,我们就以左边界为参考位置好了,令两个区间左边界尽量靠近,即la、lb(这里的区间指的都是有效区间,即lucky区间)

然后根据题目,很明显两个区间都有循环节,循环节我们全都看作同一个即可,所以现在我们就只有两个区间,一个[la,ra],一个[lb,rb],我们的目标就是通过每次移动任一区间k距离,使得这两个区间的起点尽量靠近。

问题来了,我们每次能够移动的k怎么求呢?

根据题意可得式:

la+ta*x=lb+tb*y+C

其中C即为二者起点的相对距离,x、y代表两个区间各自的移动次数(一次ta或者tb距离),x、y可取任一值。

移项

la+ta*x-lb-tb*y=C

la-lb-GCD(ta,tb)(x*q-p*y)=C

所以我们每次移动,最多可将两个区间起点的相对距离缩小GCD(ta,tb)。

接下来就好办了,我们就只需讨论两种情况,假设la

一种是la刚好小于lb的情况,即满足la

一种是la刚好大于lb的情况,即在上一种情况下la再右移一次。

统计这两种情况下幸运区间的最长重合区间即可。

#include
using namespace std;
int main()
{
    int n,m,i,j,k,ans,num,sum,la,ra,ta,lb,rb,tb;
    scanf("%d%d%d",&la,&ra,&ta);
    scanf("%d%d%d",&lb,&rb,&tb);
    int len1=ra-la,len2=rb-lb;
    num=__gcd(ta,tb);
    ans=0;
    if(la

 

你可能感兴趣的:(codeforces,acm,icpc)