| 五指山 |
| Time Limit 1000ms |
Memory Limit 65536K |
|
| description |
西遊記中孫吾空大鬧天宮,如來佛祖前來降伏他,說道:“我與你打個賭賽;你若有本事,一筋鬥打出我這右手掌中,算你贏,再不用動刀兵苦爭戰,就請玉帝到西方居住,把天宮讓你;若不能打出手掌,你還下界為妖,再修幾劫,卻來爭吵。”那大聖聞言,暗笑道:“這如來十分好獃!我老孫一筋鬥去十萬八千裡。他那手掌,方圓不滿一尺,如何跳不出去?”急發聲道:“既如此說,你可做得主張?”佛祖道:“做得!做得!”伸開右手,卻似個荷葉大小。那大聖收了如意棒,抖擻神威,將身一縱,站在佛祖手心裡,卻道聲:“我出去也!”你看他一路雲光,無影無形去了。大聖行時,忽見有五根肉紅柱子,撐著一股青氣。他道:“此間乃盡頭路了。這番回去,如來作證,靈霄殿定是我坐也。”翻轉筋鬥雲,徑回本處,站在如來掌:“我已去,今來了。你教玉帝讓天宮與我。”如來罵道:“你正好不曾離了我掌哩!”大聖道:“你是不知。我去到天盡頭,見五根肉紅柱,撐著一股青氣,我留個記在那裡,你敢和我同去看嗎?”如來道:“不消去,你只自低頭看看。”那大聖睜圓火眼金睛,低頭看時,原來佛祖右手中指寫著“齊天大聖,到此一遊。”大聖大吃了一驚道:“有這等事!有這等事!我將此字寫在撐天柱子上,如何卻在他手指上?莫非有個未蔔Crowdsourced Security Testing的法術?我決不信!不信!等我再去來!”好大聖,急縱身又要跳出,被佛祖翻掌一撲,把這猴王推出西天門外,將五指化作金、木、水、火、土五座聯山,喚名“五行山”,輕輕的把他壓住。 我們假設佛祖的手掌是一個圓圈(所以任憑大聖一個筋鬥雲十萬八千裡也是飛不出其手掌心),圓圈的長為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 |
23 2 0 23 2 0 1 |
| sample_output |
12
|
#include <iostream>using namespace std;typedef long long int64;int64 ex_gcd(int64 a,int64 b, int64 & x, int64 & y){if(b == 0){x = 1;y = 0;return a;}else{int64 r = ex_gcd(b, a%b, x, y);int64 t = x;x = y;y = t - a/b * y;return r;}}int64 gcd(int a,int b){if(b==0)return a;return gcd(b, a%b);}int main() {int64 k;cin >> k;int64 n,m,x,y;while(k--){cin >> n >> m >> x >> y;int64 a = m;int64 b = n;int64 d = (y - x + n) % n; // ax + by = dint64 X0,Y0;int64 gcd = ex_gcd(a,b, X0, Y0);cout << X0 << endl;cout << gcd << endl;int64 r = b / gcd;if(d % gcd)cout << "Impossible" << endl;elsecout <<( d/ gcd * X0 % r + r) % r << endl;}return 0;}