1299. 五指山

圆圈的长为 \(n\),逆时针记为:\(0,1,2,…,n−1\),而大圣每次飞的距离为 \(d\)

大圣所在的位置记为 \(x\),而大圣想去的地方在 \(y\),且筋斗云只沿着逆时针方向翻,告诉大圣至少要飞多少次才能到达目的地。

思路

假设飞\(m\)次到达目的地。

则满足:\((x+m*d) \mod n = y\),即\(x+m*d = y+n*k\)

于是\(-n*k+m*d = y - x\),用扩展欧几里得求解出最小的\(m\),思路同[NOIP2012 提高组] 同余方程

int n,dis,st,ed;

int exgcd(int a,int b,int &x,int &y)
{
    if(!b)
    {
        x=1,y=0;
        return a;
    }

    int d=exgcd(b,a%b,x,y);
    int t=x;
    x=y;
    y=t-a/b*y;
    return d;
}

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        cin>>n>>dis>>st>>ed;

        int x,y;
        int d=exgcd(n,dis,x,y);

        if((ed-st) % d) puts("Impossible");
        else
        {
            LL res=(LL)y*(ed-st)/d;
            cout<<(res%(n/d)+n/d)%(n/d)<<endl;
        }
    }
    //system("pause");
    return 0;
}
posted @ 2021-04-03 17:47  Dazzling!  阅读(26)  评论(0编辑  收藏  举报