圆圈的长为 (n),逆时针记为:(0,1,2,…,n−1),而大圣每次飞的距离为 (d)。
大圣所在的位置记为 (x),而大圣想去的地方在 (y),且筋斗云只沿着逆时针方向翻,告诉大圣至少要飞多少次才能到达目的地。
思路
假设飞(m)次到达目的地。
则满足:((x+m*d) mod n = y),即(x+m*d = y+n*k)。
于是(-n*k+m*d = y - x),用扩展欧几里得求解出最小的(m),思路同[NOIP2012 提高组] 同余方程。
int n,dis,st,ed;
int exgcd(int a,int b,int &x,int &y)
{
if(!b)
{
x=1,y=0;
return a;
}
int d=exgcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
return d;
}
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>n>>dis>>st>>ed;
int x,y;
int d=exgcd(n,dis,x,y);
if((ed-st) % d) puts("Impossible");
else
{
LL res=(LL)y*(ed-st)/d;
cout<<(res%(n/d)+n/d)%(n/d)<<endl;
}
}
//system("pause");
return 0;
}