博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 10627 - Infinite Race(数论)
阅读量:4620 次
发布时间:2019-06-09

本文共 1292 字,大约阅读时间需要 4 分钟。

UVA 10627 - Infinite Race

题意:一段跑道,A,B分别在两端,速度为u。v,两个人跑到还有一端立即回头,回头时间不计,问经过单位时间t。两人相遇几次

思路:追及相遇问题。这样计算:

1、迎面相遇次数:第N次迎面相遇,路程和 = 全程*(2N-1)
ans+=((u+v)t+l)/(2l)
2、追及相遇次数:第N次追上相遇,路程差 = 全程*(2N-1)
ans+=((uv)t+l)/(2l)
3、比較麻烦的是要扣掉边界位置迎面和追及反复的次数
设r为两人到同一端点的最少时间。因此1、t=(2k+1)r
2、ur=k1l 3、vr=k2l
rl/vl/u,rl/gcd(u,v)
2式子变形,得到u/gcd(u,v)r/(l/gcd(u,v))=k1
因此r取最小的正数解, 得到r=l/gcd(u,v)
1式变形,得到k=(tr)/(2r),将r带回得到k=(tgcd(u,v)+l)/(2l)
可是这样还不算完。因为ur和vr必须差一个奇数个的l。将r带入。得到
(l/gcd(u,v)l/gcd(u,v))必须为奇数才有反复的情况出现,须要推断
所以最后反复情况为:
if ((u - v) / gcd(u, v) % 2)
ans -= (gcd(u, v) * t + l) / (2 * l)
代码:

#include 
#include
#include
#include
#include
using namespace std;long long l, u, v, t;long long gcd(long long a, long long b) { if (!b) return a; return gcd(b, a % b);}int main() { while (~scanf("%lld%lld%lld%lld", &l, &u, &v, &t) && l) { if (u == 0 && v == 0) { printf("0\n"); continue; } if (u < v) swap(u, v); long long ans = 0; ans += ((u + v) * t + l) / (2 * l); ans += ((u - v) * t + l) / (2 * l); long long d = gcd(u, v); if ((u - v) / d % 2) ans -= (d * t + l) / (2 * l); printf("%lld\n", ans); } return 0;}

转载于:https://www.cnblogs.com/blfshiye/p/5213437.html

你可能感兴趣的文章
JDK提供的几个基本注解
查看>>
Firebird数据库值得信赖吗?为什么我要在开发中选择...
查看>>
__rept__和__str__
查看>>
docker镜像基本操作
查看>>
算法第五章上机实践报告
查看>>
SHELL学习笔记----IF条件判断,判断条件
查看>>
RegisterWaitForSingleObject的使用
查看>>
UML第三次作业
查看>>
000 Python教程
查看>>
2013能量篇终止,2014精致篇起航
查看>>
力扣——分数排名(数据库的题
查看>>
力扣——行程与用户(数据库的题
查看>>
3.java基础语法(下)
查看>>
ios 11 系统CPU过高,xib中textfield使用导致出过高
查看>>
JS应用(资料很全)
查看>>
JAVA 自动生成对应数据库表的JPA代码工具
查看>>
一个用 C 语言写的迷你版 2048 游戏,仅仅有 500个字符
查看>>
Linux虚拟文件系统VFS解决
查看>>
应用程序配置文件
查看>>
SharePoint 2010 中创建超链接到Pop-Up对话框
查看>>