题目:五指山
解析:
exgcd,随便推一下就行了。
PS:最初只有90分,因为求最小正整数解我是这样写的:
ans=(x%b+b)%b;
然而这是错的,应该是:
ans=(x%(b/gcd)+(b/gcd))%(b/gcd);
具体原因请自行了解扩欧原理。
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
int m,x,y,a,b,d,t,n,gcd;
inline void exgcd(int a,int b)
{
if(!b) gcd=a,x=1,y=0;
else
{
exgcd(b,a%b);
int t=x;
x=y;
y=t-a/b*x;
}
}
signed main()
{
cin>>t;
while(t--)
{
cin>>n>>d>>a>>b;
m=b-a,a=d,b=n;
exgcd(a,b);
if(m%gcd) puts("Impossible");
else x*=(m/gcd),cout<<(x%(b/gcd)+(b/gcd))%(b/gcd)<<"\n";
ans=(x%(b/gcd)+(b/gcd))%(b/gcd);
}
return 0;
}