• 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 }
  • 相关阅读:
    CSP2022 摆烂游记
    CF986C AND Graph(图论+二进制连边)
    P6144 [USACO20FEB]Help Yourself P(DP+线段树)
    CF1017G The Tree(统计+树剖)
    CF559E Gerald and Path(DP)
    CF1004F Sonya and Bitwise OR(线段树平衡复杂度+or 前缀性质)
    一些名言
    fatal: detected dubious ownership in repository 问题解决
    各种计划
    MOS选型
  • 原文地址:https://www.cnblogs.com/dilthey/p/7534710.html
Copyright © 2020-2023  润新知