POJ 1061 青蛙的约会
2010-12-11 23:28
246 查看
问两只青蛙能否相遇,即问x+km=y+kn(mod l) 是否有解,如果有解,还需要输出最小解
移项后,变成一次同余式ax=b(mod l)
根据定理,当d=gcd(a,l)|b时,方程有解,且必然有一解为x'=u*b/d,其中au+lq=d,且共有l/d个解,X=x'+k*(l/d),k=0,1,2……(l/d-1)
由于X=x' mod (l/d),最小解肯定在(0,l/d)中间
代码:
移项后,变成一次同余式ax=b(mod l)
根据定理,当d=gcd(a,l)|b时,方程有解,且必然有一解为x'=u*b/d,其中au+lq=d,且共有l/d个解,X=x'+k*(l/d),k=0,1,2……(l/d-1)
由于X=x' mod (l/d),最小解肯定在(0,l/d)中间
代码:
#include<iostream> #include<memory.h> #include<string> #include<cstdio> #include<algorithm> #include<math.h> #include<stack> #include<queue> #include<vector> #include<map> using namespace std; long long gcd(long long a,long long b,long long &x,long long &y) { if(b==0) { x=1; y=0; return a; } long long d=gcd(b,a%b,x,y); long long tmp=x; x=y; y=tmp-a/b*y; return d; } int main() { long long n,m,a,b,l,x,y; while(scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l)!=EOF) { a=((m-n)%l+l)%l; b=((y-x)%l+l)%l; long long d=gcd(a,l,x,y); if(b%d!=0) { puts("Impossible"); continue; } long long ans=(b*x/d+l)%l; //cout<<ans<<endl; l/=d; ans=(ans%l+l)%l; printf("%lld\n",ans); } return 0; }
相关文章推荐
- POJ 1061 青蛙的约会 扩展欧几里得
- 20140714 「初等数论 - 拓展欧几里得+同余模方程」POJ 1061 青蛙的约会
- poj1061 青蛙的约会(扩展欧几里得算法求解同余方程)
- poj 1061 青蛙的约会
- POJ - 1061 青蛙的约会(拓展GCD
- poj - 1061 青蛙的约会【扩展欧几里】
- AC日记——青蛙的约会 poj 1061
- poj 1061 青蛙的约会(扩展欧几里得)
- POJ 1061 青蛙的约会
- POJ 1061 青蛙的约会
- POJ 1061-青蛙的约会(拓展欧几里得)
- poj1061 青蛙的约会(扩展欧几里得)
- POJ 1061 青蛙的约会
- POJ 1061青蛙的约会。求解(x+mT)%L=(y+nT)%L的最小步数T。
- poj1061青蛙的约会--扩展欧几里得
- POJ 1061 青蛙的约会
- POJ 1061:青蛙的约会
- POJ 1061 青蛙的约会
- POJ-1061 青蛙的约会(扩展欧几里得)
- 青蛙的约会 POJ - 1061 拓展欧几里得