1
2 扩展欧几里得,方程为dt-pn=y-x;(pn可以看成是以x为起点和终点的圈数) 画个圆感受一下就可以了 代码: #include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
__int64 gcd(__int64 a,__int64 b)
{
if(b==0)
return a;
return gcd(b,a%b);
}
__int64 exgcd(__int64 a,__int64 &x,__int64 b,__int64&y)
{
if(b==0)
{
x=1;y=0;
return a;
}
__int64 r=exgcd(b,x,a%b,y);
__int64 temp=x;
x=y;
y=temp-a/b*y;
return r;
}
int main()
{
int t;
cin>>t;
while(t--)
{
__int64 n,d,x,y;
cin>>n>>d>>x>>y;
__int64 dis;
dis=(y-x+n)%n;
__int64 t0,p0;
__int64 gc=gcd(d,n);
if(dis%gc!=0)
{
cout<<"Impossible"<<endl;
continue;
}
d=d/gc;
n=n/gc;
exgcd(d,t0,n,p0);
t0=(t0+n)%n;
__int64 t=(t0*dis/gc+n)%n;
cout<<t<<endl;
}
}
|