题目链接: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; }