zoukankan      html  css  js  c++  java
  • NEFU 84

    题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=84

    Time Limit:1000ms  Memory Limit:65536K

    Description

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

    Input

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

    Output

    对于每组测试数据,输出一行,给出大圣最少要翻多少个筋斗云才能到达目的地。如果无论翻多少个筋斗云也不能到达,输出“Impossible”.

    Sample Input

    2
    3 2 0 2
    3 2 0 1
    

    Sample Output

    1
    2

    题解:

    不难列出方程:x + ans * d ≡ y (mod n),联想到上一篇文章http://www.cnblogs.com/dilthey/p/7529257.html,立刻想到解同余方程;

    于是,先对方程进行变换:ans * d ≡ y - x (mod n),当然需要注意的是,此处y - x是在[0,n-1]范围内的值;

    然后直接用exgcd解这个方程即可。

     1 #include<cstdio>
     2 typedef long long ll;
     3 ll n,d,x,y;
     4 ll gcd,ans,tmp;
     5 void exgcd(ll a,ll b,ll &d,ll &x,ll &y){
     6     if(!b){d=a;x=1;y=0;}
     7     else {exgcd(b,a%b,d,y,x);y-=(a/b)*x;}
     8 }
     9 int main()
    10 {
    11     int t;
    12     scanf("%d",&t);
    13     while(t--)
    14     {
    15         scanf("%lld%lld%lld%lld",&n,&d,&x,&y);
    16         y-=x; y=(y%n+n)%n;//对y-x进行处理,使其在[0,n-1]范围内
    17         exgcd(d,n,gcd,ans,tmp);
    18         if(y%gcd!=0) printf("Impossible
    ");
    19         else
    20         {
    21             ans*=y/gcd;
    22             ans=(ans%(n/gcd)+(n/gcd))%(n/gcd);
    23             printf("%lld
    ",ans);
    24         }
    25     }
    26     return 0;
    27 }
  • 相关阅读:
    leetcode--Populating Next Right Pointers in Each Node II
    leetcode—Populating Next Right Pointers in Each Node
    Pascal's Triangle II
    leetcode—pascal triangle
    leetcode—triangle
    October 23rd, 2017 Week 43rd Monday
    October 22nd, 2017 Week 43rd Sunday
    October 21st 2017 Week 42nd Saturday
    October 20th 2017 Week 42nd Friday
    October 19th 2017 Week 42nd Thursday
  • 原文地址:https://www.cnblogs.com/dilthey/p/7534710.html
Copyright © 2011-2022 走看看