【扩展欧几里德】Vijos P1009 清帝之惑之康熙

题目链接:

  https://vijos.org/p/1009

题目大意

  两个人,一个在坐标x,每天走m,一个在坐标y,每天走n,坐标长L,问几天后碰面。

题目思路:

  【扩展欧几里德】

  根据同余方程的ax+by=c,可以得出a=n-m,b=l,c=x-y 之后扩展欧几里得求线性同余方程。

  题目数据较大需要使用long long

 1 //
 2 //by coolxxx
 3 //
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<string>
 7 #include<iomanip>
 8 #include<memory.h>
 9 #include<time.h>
10 #include<stdio.h>
11 #include<stdlib.h>
12 #include<string.h>
13 #include<stdbool.h>
14 #include<math.h>
15 #define min(a,b) ((a)<(b)?(a):(b))
16 #define max(a,b) ((a)>(b)?(a):(b))
17 #define abs(a) ((a)>0?(a):(-(a)))
18 #define lowbit(a) (a&(-a))
19 #define sqr(a) (a)*(a)
20 #define swap(a,b) (a)^=(b),(b)^=(a),(a)^=(b)
21 #define eps 1e-8
22 #define MAX 0x7f7f7f7f
23 #define INF 20000
24 #define PI 3.1415926535897
25 #define N 100004
26 using namespace std;
27 int n,m,lll,ans,cas;
28 long long x,y,a,b,c,d;
29 long long exgcd(long long a,long long b)
30 {
31     if(!b)
32     {
33         x=1;y=0;
34         return a;
35     }
36     d=exgcd(b,a%b);
37     cas=x;
38     x=y;
39     y=cas-(a/b)*y;
40     return d;
41 }
42 int main()
43 {
44     #ifndef ONLINE_JUDGE
45 //    freopen("1.txt","r",stdin);
46 //    freopen("2.txt","w",stdout);
47     #endif
48     int i,j,k;
49     while(~scanf("%d",&n) && n)
50     {
51         x=n;
52         scanf("%lld%lld%lld%lld",&y,&m,&n,&b);//(n-m)X mod b = x-y; aX mod b = c
53         a=((m-n)%b+b)%b;
54         c=((y-x)%b+b)%b;
55         d=exgcd(a,b);
56         if(c%d!=0)
57         {
58             puts("Impossible");
59             continue;
60         }
61         a/=d;b/=d;c/=d;
62         exgcd(a,b);
63         x=(x%b+b)%b;
64         x=(x*c)%b;
65         printf("%lld\n",x);
66     }
67     return 0;
68 }
69
70
71 /*
72 //
73
74 //
75 */

时间: 2024-10-03 01:29:19

【扩展欧几里德】Vijos P1009 清帝之惑之康熙的相关文章

vijos 1009 清帝之惑之康熙

清帝之惑之康熙 背景 康熙是中国历史乃至世界历史中最伟大的帝王之一,清除螯拜,撤除三藩,统一台湾,平定准葛尔叛乱:与此同时,出众的他也被世界各国遣清使臣所折服.康熙是历史上少有的全人,不仅文武兼得,而且在各各方面都有见地,比如说航海.数学.英语.构图.建筑等等.一个最好的例子可以证明:康熙当年演算代数题的草稿纸至今仍然保存完好. 话说康熙掌权之后,每天都抽空做数学题,特别是无聊题.这些天,某某老师开始教他做一些奇怪的题目.在第一节课的时候,老师就问了康熙一个超BT的题目: 描述 话说西汉时期,汉

JDOJ-1194: VIJOS-P1009 清帝之惑之康熙

1194: VIJOS-P1009 清帝之惑之康熙 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 376  Solved: 122[Submit][Status][Web Board] Description 话说西汉时期,汉武帝刘彻派遣张骞出使西域,欲同月氏国结交而共驱匈奴.同时,月氏国也欲同大汉结交,也派出使者康破伦出使大汉,可是因为月氏国对于大汉的认知甚少,康破伦同样向西出使大汉.一开始,张骞从大汉出发,康破伦从月氏国出发,两人都在同一纬度线

【动态规划】Vijos P1011 清帝之惑之顺治

题目链接: https://vijos.org/p/1011 题目大意: 给一张N*M的地图(N,M<=500),可从任一点开始沿上下左右走,只能走比当前低的地方.问最长能走多少格. 题目思路: [动态规划] 这题就是滑雪,动态规划. 将高度排序后从低往高算,当前高度所在的格子上下左右比当前高度低就可以用来更新答案. 1 // 2 //by coolxxx 3 // 4 #include<iostream> 5 #include<algorithm> 6 #include&l

【高精度】Vijos P1010 清帝之惑之乾隆

题目链接: https://vijos.org/p/1010 题目大意: 多组数据,求R的n次幂(R为不超过9999.9的小数 n<=200)R保证占6位 不输出前导0和后缀0,整数就只输出整数部分 题目思路: [高精度] 直接用double算是肯定不行的.毕竟精度要求那么高. 做法是先记下最终要输出的小数位数,然后把这个小数放大到6位,接下来算个高精度的幂之后处理一下输出就行了 1 // 2 //by coolxxx 3 // 4 #include<iostream> 5 #inclu

【枚举】Vijos P1012 清帝之惑之雍正

题目链接: https://vijos.org/p/1012 题目大意: 给n个坐标(n<=100 000),求直线距离最短是多少.数据较大用long long 或 double 题目思路: [枚举] 正解貌似是分治,不过我一看就暴力枚举+剪枝了. 先按x y为第一.第二关键字排序. 设当前最优解为c,如果当前的点对x坐标差的平方比最优解大就可以break了. 1 // 2 //by coolxxx 3 // 4 #include<iostream> 5 #include<algo

【VIJOS】 p1009-p1012 清帝之惑

原题传送门:https://vijos.org/p/%E6%B8%85%E5%B8%9D%E4%B9%8B%E6%83%91 雍正 求平面上最近的两点的距离,O(nlogn)算法实现,详解见 http://blog.csdn.net/lytning/article/details/25370169 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #incl

扩展欧几里德算法

文章来源:http://blog.csdn.net/zhjchengfeng5/article/details/7786595 谁是欧几里德?自己百度去 先介绍什么叫做欧几里德算法 有两个数 a b,现在,我们要求 a b 的最大公约数,怎么求?枚举他们的因子?不现实,当 a b 很大的时候,枚举显得那么的na?ve ,那怎么做? 欧几里德有个十分又用的定理: gcd(a, b) = gcd(b , a%b) ,这样,我们就可以在几乎是 log 的时间复杂度里求解出来 a 和 b 的最大公约数了

POJ2142 The Balance (扩展欧几里德)

本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia The Balance 题目大意  你有一个天平(天平左右两边都可以放砝码)与重量为a,b(1<=a,b<=10000)的两种砝码.让你求出一种方案称出重为c(1<=c<=50000)的物品,如有多种方案,请输出两种砝码需要数量的总和最小的方案. 输入 有若干行,每行三个数,a,b,c. 结束时用0 0 0表示. 输出 若干行,每行两个数,表示每个询问中a的数量与b的数量 如果无解输出 

欧几里德与扩展欧几里德算法(转)

欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). 第一种证明: a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r 因此d是(b,a mod b)的公约数 假设d 是(b,a mod b)的公约数,则 d | b , d |r ,但是a