康熙的难题-模拟爆炸祭
我以为我能水上几分
结果被忘删掉freopen的注释而gg
哭辽
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
康熙的难题(kangxi)题面
题目描述
话说西汉时期,汉武帝刘彻派遣张骞出使西域,欲同月氏国结交而共驱匈奴。
同时,月氏国也欲同大汉结交,也派出使者康破伦出使大汉,可是因为月氏国对于大汉的认知甚少,康破伦同样向西出使大汉。
一开始,张骞从大汉出发,康破伦从月氏国出发,两人都在同一纬度线上,张骞所处的经度为x,康破伦所处的经度为y;
接下来,两人同时向西走,而且只能向西走,张骞每天走m 公里,康破伦每天走n 公里,且每天走路的速度不变,也不停下来休息;
这样两人就在这一条长为L 的纬度线上一直向西走。
问:过了多少天之后张骞和康破伦会碰面,并磋商两国结交之事(所谓碰面,是指两人处在同一经度上)。
这下,康熙犯难了,他还是个不大的青年,怎么可能做得出这么难的题目;
但是,他又是统领全国的帝皇,怎么能在老师面前丢这么大一个面子。
康熙想:不行!一定得把这个题做出来!(然后就有了下面这段记录)
第一天,……
第二天,…………
第三天,………………
第四天,……………………
第五天,…………………………
第六天,………………………………
第七天,……………………………………!!!!!!!
啊!第七天,康熙终于打了7 个感叹号,得出了一个重要的结论!!!!!
那就是——做不出来。(汗),没办法,他只有请教你,他的挚友,帮他解决这一难题。
康熙答应你,如果你把这一题做出来了,你将得到御赐赏银一万万两!$$$$$$$$-$$$$$$$$。
为了改变你生活的现状——衣衫褴褛、闻鼠起舞、蟑螂为伴,你下定了决心——我一定得把这题解决!
输入
输入只包括一行5 个整数x,y,m,n,L
其中0<x≠y < =2000000000,0 < m、n < =2000000000,0 < L <=2100000000。
输出
输出碰面所需要的天数,如果永远不可能碰面则输出一行
"Impossible"。
样例输入
1 2 3 4 5
样例输出
4
----------------------------------------------------------------------------------------------------------------------------------------------------------------
以前模拟的题
(看完我就内疚了,当时这是大概看懂了,但原理还不能自己手推出来)
甲走m乙走n相当与一个人走abs|m - n|步;
于是就可得
abs|m-n| * a + l * b = |y - x|
(a,b是要求的变量)
两边同时除到1
abs|m-n| * a1 + l * b1 = 1
而此时的a和b已经不是上一个式子中的a和b了
而是
a1=a/|y - x|
b1=b/|y - x|
让exgcd返回gcd(abs|m-n|,l)的值
只是需要特判一下Impossible的情况
1. 甲乙两个人走的速度相同。
2. 两个人相差的距离不是求到的exgcd的倍数
这样输出Impossible就可以了
如果正常的话
取一个模
这个模为 l/gcd(abs|m-n|,l);
但要注意把余数取成负数的情况
最终的天数即为a/gcd(abs(m-n),l);
则为|y-x|/gcd(abs(m-n),l)*a/|y-x
#include <iostream> using namespace std; long long ex_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 = ex_gcd(b, a % b, x, y); long long t; t = x; x = y; y = t - (a / b) * x; return d; } int main() { freopen("kangxi.in","r",stdin); freopen("kangxi.out","w",stdout); long long x0, y0, m, n, l, a, b, c, x, y;; cin>>x0>>y0>>m>>n>>l; a = m - n; b = l; c = y0 - x0; if (a < 0) { a = -a; c = -c; } long long d = ex_gcd(a, b, x, y); if (m == n || c % d != 0) cout<<"Impossible"<<endl; else { b /= d; c /= d; long long t = c * x; cout<<(t % b + b) % b<<endl; } return 0; }