康熙的难题-模拟爆炸祭

我以为我能水上几分

结果被忘删掉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;
}
原文地址:https://www.cnblogs.com/darlingroot/p/10587466.html