nefu 84 五指山(扩展ou'ji'li)

五指山

Problem:84
Time Limit:1000ms
Memory Limit:65536K

Description

<span style="font-size:18px;">西游记中孙吾空大闹天宫,如来佛祖前来降伏他,说道:“我与你打个赌赛;你若有本事,一筋斗打出我这右手掌中,算你赢,再不用动刀兵苦争战,就请玉帝到西方居住,把天宫让你;若不能打出手掌,你还下界为妖,再修几劫,却来争吵。”
那大圣闻言,暗笑道:“这如来十分好呆!我老孙一筋斗去十万八千里。他那手掌,方圆不满一尺,如何跳不出去?”急发声道:“既如此说,你可做得主张?”佛祖道:“做得!做得!”伸开右手,却似个荷叶大小。那大圣收了如意棒,抖擞神威,将身一纵,站在佛祖手心里,却道声:“我出去也!”你看他一路云光,无影无形去了。大圣行时,忽见有五根肉红柱子,撑着一股青气。他道:“此间乃尽头路了。这番回去,如来作证,灵霄殿定是我坐也。”翻转筋斗云,径回本处,站在如来掌:“我已去,今来了。你教玉帝让天宫与我。”
如来骂道:“你正好不曾离了我掌哩!”大圣道:“你是不知。我去到天尽头,见五根肉红柱,撑着一股青气,我留个记在那里,你敢和我同去看么?”如来道:“不消去,你只自低头看看。”那大圣睁圆火眼金睛,低头看时,原来佛祖右手中指写着“齐天大圣,到此一游。”大圣大吃了一惊道:“有这等事!有这等事!我将此字写在撑天柱子上,如何却在他手指上?莫非有个未卜先知的法术?我决不信!不信!等我再去来!”
好大圣,急纵身又要跳出,被佛祖翻掌一扑,把这猴王推出西天门外,将五指化作金、木、水、火、土五座联山,唤名“五行山”,轻轻的把他压住。
    我们假设佛祖的手掌是一个圆圈(所以任凭大圣一个筋斗云十万八千里也是飞不出其手掌心),圆圈的长为n,逆时针记为:0,1,2,…,n-1,而大圣每次飞的距离为d.现在大圣所在的位置记为x,而大圣想去的地方在y。现在要你告诉大圣至少要多少筋斗云才能到达目的地。</span>

Input

<span style="font-size:18px;">有多组测试数据。
第一行是一个正整数T,表示测试数据的组数。
每组测试数据包括一行,四个非负整数,n(2 &amp;lt; n &amp;lt; 10^9),表示如来手掌圆圈的长度;d(0 &amp;lt; d &amp;lt; n),筋斗所能飞的距离;x(0 &amp;lt;= x &amp;lt; n),大圣的初始位置;y(0 &amp;lt;= y &amp;lt; n),大圣想去的地方。
   注意孙悟空的筋斗云只沿着逆时针方向翻。
</span>

Output

<span style="font-size:18px;">对于每组测试数据,输出一行,给出大圣最少要翻多少个筋斗云才能到达目的地。如果无论翻多少个筋斗云也不能到达,输出“Impossible”.</span>

Sample Input

<span style="font-size:18px;">2
3 2 0 2
3 2 0 1
</span>

Sample Output

<span style="font-size:18px;">1
2
</span>

Hint

Source


思路:

根据已知条件:X:起点,Y:终点,

设dx表示整数次跟斗的长度,ny为整数圈如来手掌

那么:dx+X=Y+ny      整数次跟斗+起点=终点+整数圈

移项,写成扩欧:dx-ny=Y-X

套模板可解

后续处理过程看代码,处理过程都是一样的

#include <iostream>
#include <math.h>
#include <stdio.h>
using namespace std;
void Ex_gcd(long long a, long long b, long long &x, long long &y)
{
    if(b == 0)//递归出口
    {
        x = 1;
        y = 0;
        return;
    }
    long long x1, y1;
    Ex_gcd(b, a%b, x1, y1);
    x = y1;
    y = x1-(a/b)*y1;
}
long long gcd(long long a,long long b)
{
     return b?gcd(b,a%b):a;
}

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        long long n,d,x,y,x0,y0,ans,a,b,c;
        cin>>n>>d>>x>>y;
        a=d;
        b=n;
        c=y-x;
        d=gcd(a,b);
        if(c%d)printf("Impossible\n");
        else
        {
          a/=d;
          b/=d;
          c/=d;
          Ex_gcd(a,b,x0,y0);
          x0*=c;
          x0=(x0%b+b)%b;//最小正整数
          cout<<x0<<endl;
        }


    }
    return 0;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值