poj1061青蛙的约会(扩展欧几里得)
2017-08-18 15:02
120 查看
poj1061青蛙的约会(扩展欧几里得)
题目链接解题思路:根据题目我们可以很容易的写出方程,设t是时间
(x+mt)modL=(y+nt)modL
经过整理可以写成
(m−n)t−kL=(y−x)
这里t和k是未知数,这时就构成了形如ax+by=d一个一元二次方程,
a=m−n
b=−k
d=y−x
求一元二次方程的解用扩展欧几里得,我就直接调用了模板。在这道题里我一直在纠结a,b,c的符号问题,程序证明a,b,c是正是负都可以丢到板子里,具体的原因我还是不是很清楚。还有一个点就是这里要求的是大于0的第一个正数解,所以如果是正数的话我就先减到负,然后在加。
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; long long exgcd(long long a,long long b,long long &x,long long &y) { if(b==0) { x=1,y=0; return a; } long long d=exgcd(b,a%b,x,y); long long tmp=x; x=y; y=tmp-a/b*y; return d; } int main() { long long x,y,m,n,l,x1,y1; scanf("%lld %lld %lld %lld %lld",&x,&y,&m,&n,&l); long long a=(m-n); long long b=l; long long c=(y-x); long long d=exgcd(a,b,x1,y1); if(c%d!=0) printf("Impossible\n"); else { a/=d,b/=d,c=c/d; x1*=c; if(b<0) b=-b;//这里b要先变成正数 while(x1>0) x1-=b; while(x1<0) x1+=b; printf("%lld\n",x1); } return 0; }
相关文章推荐
- poj1061青蛙的约会(扩展欧几里得)
- POJ1061青蛙的约会(扩展欧几里得)
- poj 1061 青蛙的约会 【扩展欧几里得】
- POJ 2891 & 2018多校练习赛(第三场)-B(扩展欧几里得解同余方程组)
- [置顶] 扩展欧几里得定理及其应用
- 扩展欧几里得问题
- 扩展欧几里得
- POJ 1061 青蛙的约会(同余定理+扩展欧几里得)
- poj1061 青蛙的约会(扩展欧几里得)
- SGU 106 The equation ----扩展欧几里得
- 扩展欧几里得定理
- HDOJ-----2669---Romantic扩展欧几里得
- 数论读书笔记——欧几里得和扩展欧几里得
- UVA 11768 Lattice Point or Not(扩展欧几里得)
- 数论学习(2)——欧几里得与扩展欧几里得
- HDU1576 A/B 扩展欧几里得
- 欧几里德 与 扩展欧几里得 学习笔记
- 扩展欧几里得
- hdu 1576 扩展欧几里得
- 扩展的欧几里得&中国剩余定理