1299. 五指山
圆圈的长为 \(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;
}