1. 程式人生 > >NEFU 84 - 五指山 - [exgcd求解一元線性同余方程]

NEFU 84 - 五指山 - [exgcd求解一元線性同余方程]

tput 如果 如意 warn acm std urn blank success

題目鏈接: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\n"); 19 else 20 { 21 ans*=y/gcd; 22 ans=(ans%(n/gcd)+(n/gcd))%(n/gcd); 23 printf("%lld\n",ans); 24 } 25 } 26 return 0; 27 }

NEFU 84 - 五指山 - [exgcd求解一元線性同余方程]