poj 1061 青蛙的约会
2015-05-30 11:07
281 查看
这题的关键就是找方程:
要想青蛙能碰面,就满足方程:
(x+m*t) - (y+n*t) = p*l;
t:跳的次数
p:两只青蛙相差的圈数
l:纬度线的长度
将上述方程整理得:
(n-m)*t + p*l = x-y;
令a=n-m,b=l,c=gcd(a,b),d=x-y;
所以就有:
a*t + b*p = d;
就是求解t的最小正整数;
要想青蛙能碰面,就满足方程:
(x+m*t) - (y+n*t) = p*l;
t:跳的次数
p:两只青蛙相差的圈数
l:纬度线的长度
将上述方程整理得:
(n-m)*t + p*l = x-y;
令a=n-m,b=l,c=gcd(a,b),d=x-y;
所以就有:
a*t + b*p = d;
就是求解t的最小正整数;
[code]#include <iostream> #include <cstdio> using namespace std; typedef long long LL; void exgcd(LL a,LL b,LL &x,LL &y)//扩展欧几里得算法 { if(b==0) { x=1; y=0; return; } exgcd(b,a%b,x,y); LL tmp=x;//关键 x=y; y=tmp-(a/b)*y; } LL gcd(LL m,LL n)//求最大公约数 { if(n==0) return m; return gcd(n,m%n); } int main() { LL x,y,m,n,l,a,b,c,d,x0,y0,flag; while(cin>>x>>y>>m>>n>>l) { flag=0;//记一下是不是有解 a=n-m,b=l; c=gcd(a,b),d=x-y; if(d%c!=0) flag=1; if(flag) puts("Impossible"); else { a/=c; b/=c; d/=c; exgcd(a,b,x0,y0);//x0与y0就是上述解题思路的t和p x0*=d; x0=(x0%b+b)%b;//最小正整数 cout<<x0<<endl; } } return 0; }
相关文章推荐
- 矩阵操作比较:Armadillo,Eigen,OpenCV
- Winform控件之DataGridView数据控件(一)
- 在网页中插入MSN,Skype,QQ的方法
- lamp全源码安装
- 分治策略总结
- 战舰F407在CMSIS-RTOS RTX下使用printf函数输出到串口
- 生活中的点滴感悟
- 我在CSDN的blog终于有排名了
- Linux(RHEL6)启动过程详解
- 工作中用到的命令
- treeView 含有母版页 不能响应OnSelectNoteChanged事件
- Oracle学习(八)之基于OFM机制的日志组管理
- C#(Winform)的Show()和ShowDialog()方法
- Codeforces Round #305 (Div. 2) C. Mike and Frog
- python集合用法实例分析
- 3.2-2
- 2015 程序设计实习之递归作业
- Linux-缓存文件写入失败!
- 求2个数的最大公约数
- 关于PICT的安装和使用