Lyft Level 5 Challenge 2018 - Final Round (Open Div. 2) C 数论

题目链接:http://codeforces.com/contest/1055/problem/C

题目思路:找到最大公因数,然后la,ra对ta取余,lb,rb对tb取余,然后求得la,lb之差,然后枚举k倍的最大公因数+la,算最大,这样时间复杂度太高,就直接将差/最大公因数=temp,枚举temp-1,temp,temp+1,求出最大值

AC代码

#include<bits/stdc++.h>
using namespace std;

int la,ra,ta;
int lb,rb,tb;
int laa,raa,taa;
int lbb,rbb,tbb;

int dis()
{
    if(raa<lbb||rbb<laa)
        return 0;
    return min(raa,rbb)-max(laa,lbb)+1;
}

int main()
{

    scanf("%d%d%d",&la,&ra,&ta);
    scanf("%d%d%d",&lb,&rb,&tb);
    la=la%ta;
    ra=ra%ta;
    lb=lb%tb;
    rb=rb%tb;
    int temp=__gcd(ta,tb);
    int ans=0;
    if(la<=lb)
    {
        int dif=lb-la;
        dif=dif/temp;
        for(int i=dif-1;i<=dif+1;++i)
        {
            laa=la+temp*i;
            raa=ra+temp*i;
            lbb=lb;
            rbb=rb;
            ans=max(ans,dis());
        }
    }
    else
    {
        int dif=la-lb;
        dif=dif/temp;
        for(int i=dif-1;i<=dif+1;++i)
        {
            laa=la;
            raa=ra;
            lbb=lb+temp*i;
            rbb=rb+temp*i;
            ans=max(ans,dis());
        }
    }
    printf("%d\n",ans);
}

猜你喜欢

转载自blog.csdn.net/qq_36921652/article/details/83994648
今日推荐