题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=84
分析:我们设需要t片筋斗云,则猴子要想由x到达y,就需要满足x+dt-y=nL(L∈Z),即==>dt≡(y-x)(mod n),只需解出该一元线性同余方程,然后找出最小的正整数解即可。类似POJ1061 青蛙的约会。求解线性同余方程,可以参考:点击打开链接
实现代码如下:
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
LL a,b,d,m,x,y;
void exgcd(LL a,LL b,LL &d,LL &x,LL &y)
{//扩展欧几里得算法
if(!b)
{
x=1,y=0,d=a;
return ;
}
else
{
exgcd(b,a%b,d,x,y);
LL temp=x;
x=y;
y=temp-(a/b)*y;
}
}
int main()
{
int t;
cin>>t;
LL k,c;
while(t--)
{
scanf("%lld%lld%lld%lld",&m,&a,&c,&k);
b=k-c;
exgcd(a,m,d,x,y);
if(b%d) puts("Impossible");
else
{
x=x*(b/d)%m; //方程ax=b(mod m)的最小解
x=(x%(m/d)+m/d)%(m/d); //方程ax=b(mod m)的最小整数解
printf("%lld\n",x);
}
}
return 0;
}