POJ1061青蛙的约会。
看到题目立刻想到使用同余方程解决,但是因为数论知识不够娴熟,还是出现了错误。
对于ax≡b(mod m) 我一开始以为仅仅在(a,m)=1时有解,但是事实上,只要,(a,m)|b,则方程就有d个模m不同余的解。
利用拓展的欧几里得算法可以求出使得(m-n)p+Lq=(m-n,L)的p和q,实际上只要求出q即可,然后我们目标是求(m-n)p'+Lq'=y-x的p'和q',所以在组后利用q'=q*(y-x)/d求出即可。
#include<iostream>
using namespace std;
long long n[3];
long long mn;
long long gcd(long long a,long long b){//注意a必须比b大
long long t;
n[0]=0;
n[1]=1;
int now=2;
int last=1;
int llast=0;
long long r;
while(a%b!=0){
r=a/b;
n[now]=n[llast]-r*n[last];
t=a%b;
a=b;
b=t;
now=(now+1)%3;
llast=(llast+1)%3;
last=(last+1)%3;
}
mn=n[last];
return b;
}
int main(){
long long x,y,m,n,L;
while(cin>>x>>y>>m>>n>>L){
long long d=gcd(L,m-n);
if((y-x)%d==0){
cout<<((y - x) / d * mn % L + L) % L<<endl;
}
else{
cout<<"Impossible"<<endl;
}
}
}
我感觉代码写的挺蠢的