NEFU 84 五指山(拓展欧几里德)

来源:互联网 发布:工业控制软件开发 编辑:程序博客网 时间:2024/04/30 08:02


  • 原题链接:Here!

  • 思路:已知四个非负整数,n(2 < n < 10^9),表示如来手掌圆圈的长度;d(0 < d < n),筋斗所能飞的距离;x(0 <= x < n),大圣的初始位置;y(0 <= y < n),大圣想去的地方。注意孙悟空的筋斗云只沿着逆时针方向翻。
    设t次翻滚能到达y点,即有方程 x + t*d = y + c*n ,(c为非负整数)
    整理得:t*d - c*n = y - x,方程有解的条件是gcd(d,n)|(y-x)

  • 代码:
    #include<iostream>using namespace std;typedef long long LL;LL exgcd(LL a,LL b,LL &x,LL &y){if(b==0){x=1; y=0; return a;}LL d = exgcd(b,a%b,x,y);LL tmp = x;x = y;y = tmp - a/b*y;return d;}int main(){LL t,n,d,x,y,x1,y1;while(cin>>t){while(t--){cin>>n>>d>>x1>>y1;LL c = y1 - x1;LL d1 = exgcd(d,n,x,y);if(c%d1){cout<<"Impossible\n";}else{LL tmp = n/d1;LL ans = x*c/d1;ans = (ans%tmp+tmp)%tmp;cout<< ans <<endl;}}}return 0;} 


0 0
原创粉丝点击