vijos P1009清帝之惑之康熙
</pre>背景康熙是中国历史乃至世界历史中最伟大的帝王之一,清除螯拜,撤除三藩,统一台湾,平定准葛尔叛乱;与此同时,出众的他也被世界各国遣清使臣所折服。康熙是历史上少有的全人,不仅文武兼得,而且在各各方面都有见地,比如说航海、数学、英语、构图、建筑等等。一个最好的例子可以证明:康熙当年演算代数题的草稿纸至今仍然保存完好。话说康熙掌权之后,每天都抽空做数学题,特别是无聊题。这些天,某某老师开始教他做一些奇怪的题目。在第一节课的时候,老师就问了康熙一个超BT的题目:描述话说西汉时期,汉武帝刘彻派遣张骞出使西域,欲同月氏国结交而共驱匈奴。同时,月氏国也欲同大汉结交,也派出使者康破伦出使大汉,可是因为月氏国对于大汉的认知甚少,康破伦同样向西出使大汉。一开始,张骞从大汉出发,康破伦从月氏国出发,两人都在同一纬度线上,张骞所处的经度为x,康破伦所处的经度为y;接下来,两人同时向西走,而且只能向西走,张骞每天走m公里,康破伦每天走n公里,且每天走路的速度不变,也不停下来休息;这样两人就在这一条长为L的纬度线上一直向西走。问:过了多少天之后张骞和康破伦会碰面,并磋商两国结交之事(所谓碰面,是指两人处在同一经度上)。这下,康熙犯难了,他还是个不大的青年,怎么可能做得出这么难的题目;但是,他又是统领全国的帝皇,怎么能在老师面前丢这么大一个面子。康熙想:不行!一定得把这个题做出来!(然后就有了下面这段记录)第一天,……第二天,…………第三天,………………第四天,……………………第五天,…………………………第六天,………………………………第七天,……………………………………!!!!!!!啊!第七天,康熙终于打了7个感叹号,得出了一个重要的结论!!!!!那就是——做不出来。(汗),没办法,他只有请教你,他的挚友,帮他解决这一难题。康熙答应你,如果你把这一题做出来了,你将得到御赐赏银一万万mod1两!$$$$$$$$-$$$$$$$$。为了改变你生活的现状——衣衫褴褛、闻鼠起舞、蟑螂为伴,你下定了决心——我一定得把这题解决!格式输入格式输入只包括一行5个整数x,y,m,n,L<p>其中0<x≠y < =2000000000,0 < m、n < =2000000000,0 < L < =2100000000。</p><p></p>输出格式<p>输出碰面所需要的天数,如果永远不可能碰面则输出一行"Impossible"。</p><p></p><p></p><p><span style="font-family:SimHei;"><span style="white-space:pre"> </span>解:这道题不难,虽然一开始没做对.这道题叙述的非常不好,众所周知,许多acm题都是穿着马甲,而它的内容,本质是一种结构,一种过程.</span></p><p><span style="font-family:SimHei;">这道题的马甲非常差劲,既然是两个人,他们当然是连续的行走,而不是一跳一跳的,像青蛙一样.北大OJ上面的"青蛙约会"那道题跟此题一样,但是人家那马甲就漂亮得多了.</span></p><p><span style="font-family:SimHei;">当然,看透马甲是一种本事,要善于找出杂乱之中的规律.这道题还可以这样描述:一个青蛙,在长为Length的赤道上,它每次只能向前跳dv这么远.现在他想到达他面前的dx处,为此,他不得不绕着赤道跳很多圈,最终有可能到达目的地.</span></p><p><span style="font-family:SimHei;">第一步:化简问题:转化成追击问题,求出来二者的dv和dx.这两个数都是正整数,求起来需要分类讨论,这是第一个难关.</span></p><p><span style="font-family:SimHei;">第二步:列出方程,其实是模线性方程:k*dv-p*length=dx.这里面k,p都是正数.表示追了k天之后,绕了地球p圈,才追上.</span></p><p><span style="font-family:SimHei;">第三步:用扩展欧几里得算法解方程,刘汝佳书上的扩展欧几里得写的非常精炼,一般人写不出来,其中巧妙之处在于通过传递引用参数交换两个数的位置.</span></p><p><span style="font-family:SimHei;">第四步:求出来k和p之后,如果dx不能整除dv和length的最大公约数d,那就说明Impossible</span></p><p><span style="font-family:SimHei;">第五步:否则,肯定能追上, 需要对k做一些工作.如果k>0,那就太好了;如果k<0,那就k+=length.这样一来k就变成正数了.实际上:</span></p><p><span style="font-family:SimHei;"><span style="white-space:pre"> </span> k*dv+p*length=dx 等价于(k*dv)%length=dx;</span></p><p><span style="font-family:SimHei;"> [(k+length)*dv]%length=dx;</span></p><p><span style="font-family:SimHei;"><span style="white-space:pre"> </span>把k变成正数之后,还要做一次乘法:dx/d,表示要走多少个周期,所以k*=(dx/d);</span></p><p><span style="font-family:SimHei;"><span style="white-space:pre"> </span>这样还没有完,因为length和dv的最大公约数是d,所以最多到达length/d个点,最多走length/d步.所以最终结果是k%(length/d);</span></p><p></p><p></p><p></p><pre name="code" class="cpp">#include<iostream>
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
void gcd(int a,int b,int &d,int&x,int &y){
if (b == 0){
d = a;
x = 1;
y = 0;
}else{
gcd(b, a%b, d, y, x);
y -= x*(a / b);
}
}
int main(){
freopen("in.txt", "r", stdin);
int x1, x2, v1, v2,len;
cin >> x1 >> x2 >> v1 >> v2 >> len;
int dx, dv;
v1 %= len;
v2 %= len;
x1 %= len;
x2 %= len;
if (v1 < v2){
swap(v1, v2);
swap(x1, x2);
}
dv = v1 - v2;
if (x1<x2){
dx = x2 - x1;
}
else{
dx = x2+len-x1;
}
int d, k,p;
gcd(dv,len, d,k,p);
if (dx%d){
cout << "Impossible" << endl;
}
else{
dv /= d;
len /= d;
if (k > 0){
cout << (dx*k / d)%len << endl;
}
else{
cout << ((len + k)*dx / d)%len << endl;
}
}
return 0;
}
vijos P1009清帝之惑之康熙的更多相关文章
- 【扩展欧几里德】Vijos P1009 清帝之惑之康熙
题目链接: https://vijos.org/p/1009 题目大意: 两个人,一个在坐标x,每天走m,一个在坐标y,每天走n,坐标长L,问几天后碰面. 题目思路: [扩展欧几里德] 根据同余方程的 ...
- Vijos 1012 清帝之惑之雍正 平面最近点对(分治)
背景 雍正帝胤祯,生于康熙十七年(1678)是康熙的第四子.康熙61年,45岁的胤祯继承帝位,在位13年,死于圆明园.庙号世宗. 胤祯是在康乾盛世前期--康熙末年社会出现停滞的形式下登上历史舞台的.复 ...
- 【枚举】Vijos P1012 清帝之惑之雍正
题目链接: https://vijos.org/p/1012 题目大意: 给n个坐标(n<=100 000),求直线距离最短是多少.数据较大用long long 或 double 题目思路: [ ...
- 【动态规划】Vijos P1011 清帝之惑之顺治
题目链接: https://vijos.org/p/1011 题目大意: 给一张N*M的地图(N,M<=500),可从任一点开始沿上下左右走,只能走比当前低的地方.问最长能走多少格. 题目思路: ...
- 【高精度】Vijos P1010 清帝之惑之乾隆
题目链接: https://vijos.org/p/1010 题目大意: 多组数据,求R的n次幂(R为不超过9999.9的小数 n<=200)R保证占6位 不输出前导0和后缀0,整数就只输出整数 ...
- Vijos 1011 清帝之惑之顺治 记忆录式的动态规划(记忆化搜索)
背景 顺治帝福临,是清朝入关后的第一位皇帝.他是皇太极的第九子,生于崇德三年(1638)崇德八年八月二ten+six日在沈阳即位,改元顺治,在位18年.卒于顺治十八年(1661),终24岁. 顺治即位 ...
- Vijos 1010 清帝之惑之乾隆
背景 乾隆,雍正的第四子,在位60年,退位后又当了三年太上皇,终年89岁. 乾隆即位之初,实行宽猛互济的政策,务实足国,重视农桑,停止捐纳,平定叛乱等一系列活动中,充分体现了他的文治武功,乾隆帝向慕风 ...
- vijos 1011 清帝之惑之顺治
背景 顺治帝福临,是清朝入关后的第一位皇帝.他是皇太极的第九子,生于崇德三年(1638)崇德八年八月二ten+six日在沈阳即位,改元顺治,在位18年.卒于顺治十八年(1661),终24岁. 顺治即位 ...
- Vijos 1040 高精度乘法
描述 高精度乘法 输入:两行,每行表示一个非负整数(不超过10000位) 输出:两数的乘积. 样例1 样例输入1 99 101 样例输出1 9999 题解 这道题和之前的Vijos 1010 清帝之惑 ...
随机推荐
- C语言 时间函数的学习和总结
一直都是以简单的time_t t,time(&t),ctime(&t)来表示时间,后来要以时间为日志文件的名字时,就有点蒙逼了.学习一下. tm结构: struct tm { ...
- css3常用动画+动画库
一.animates.css animate.css是来自dropbox的工程师Daniel Eden开发的一款CSS3的动画效果小类库.包含了60多款不同类型的CSS3动画,包括:晃动,闪动,各种淡 ...
- 32-bit Assembly on x86_64 Linux (Use Nasm and ld&gcc)
Assembly on x86_64 Linux Some instructions in Intel assembly set are invalid in x86_64 env. e.g. aaa ...
- 淘宝美工一站式:淘宝ps高级美工技巧视频教程,HTML代码学习【教程下载
视频免费下载地址:http://www.fu83.cn/thread-243-1-1.html
- HDU5492 Find a path[DP 方差]
Find a path Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 新闻发布系统<分页>
分页实现: 实现数据的分页显示,需要以下几个关键步骤: ①确定每页显示的总页数 ②计算显示的总页数 ③编写SQL语句 实现效果如图所示: 当点击下一页时,地址栏地址为?pageIndex=2 1.创建 ...
- AC日记——最长最短单词 openjudge 1.7 25
25:最长最短单词 总时间限制: 1000ms 内存限制: 65536kB 描述 输入1行句子(不多于200个单词,每个单词长度不超过100),只包含字母.空格和逗号.单词由至少一个连续的字母构成 ...
- jmeter 和 ajax
https://bitbucket.org/blazemeter/ajax-sampler/downloads/blazemeter-ajax-sampler-1.0-SNAPSHOT.jar 下载一 ...
- Sublime3安装过程及常用插件安装及常用快捷键
1 先去http://www.sublimetext.com/官网下载软件,然后网上找一个验证码,注册完成. 2 安装Package Control ,Package Control 插件是一个方 ...
- window.open与window.close的兼容性问题
window.open(页面地址url,打开的方式) 方法 打开一个新的窗口(页面) 如果url为空,则默认打开一个空白页面 如果打开方式为空,默认为新窗口方式打开 返回值:返回新打开窗口的windo ...