ACM_扩展欧几里德算法】的更多相关文章

<pre name="code" class="cpp">/* 扩展欧几里德算法 基本算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by. 证明:设 a>b. 1,显然当 b=0,gcd(a,b)=a.此时 x=1,y=0: 2,ab!=0 时 设 ax1+by1=gcd(a,b); bx2+(a mod b)y2=gcd(b,a mod b); 根据…
10402: C.机器人 Description Dr. Kong 设计的机器人卡尔非常活泼,既能原地蹦,又能跳远.由于受软硬件设计所限,机器人卡尔只能定点跳远.若机器人站在(X,Y)位置,它可以原地蹦,但只可以在(X,Y),(X,-Y),(-X,Y),(-X,-Y),(Y,X),(Y,-X),(-Y,X),(-Y,-X)八个点跳来跳去. 现在,Dr. Kong想在机器人卡尔身上设计一个计数器,记录它蹦蹦跳跳的数字变化(S,T),即,路过的位置坐标值之和. 你能帮助Dr. Kong判断机器人能否…
欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数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…
一,题意: 有两个类型的砝码,质量分别为a,b;现在要求称出质量为d的物品, 要用多少a砝码(x)和多少b砝码(y),使得(x+y)最小.(注意:砝码位置有左右之分). 二,思路: 1,砝码有左右位置之分,应对比两种情况 i,a左b右,得出方程 ax1 - by1 = d ; ii,b左a右,得出方程 bx2 - ay2 = d . 2,利用扩展欧几里德算法,解出(x1,y1).(x2,y2),并求出最小x1和x2,以及相对应的y1,y2. 3,输出x1+y1和x2+y2 中的最小值. 三,步骤…
本题和poj1061青蛙问题同属一类,都运用到扩展欧几里德算法,可以参考poj1061,解题思路步骤基本都一样.一,题意: 对于for(i=A ; i!=B ;i+=C)循环语句,问在k位存储系统中循环几次才会结束. 比如:当k=4时,存储的数 i 在0-15之间循环.(本题默认为无符号) 若在有限次内结束,则输出循环次数. 否则输出死循环.二,思路: 本题利用扩展欧几里德算法求线性同余方程,设循环次数为 x ,则解方程 (A + C*x) % 2^k = B ;求出最小正整数 x. 1,化简方…
一,题意: 两个青蛙在赤道上跳跃,走环路.起始位置分别为x,y. 每次跳跃距离分别为m,n.赤道长度为L.两青蛙跳跃方向与次数相同的情况下, 问两青蛙是否有方法跳跃到同一点.输出最少跳跃次数.二,思路: 本题用到扩展欧几里德算法求二元一次不定式方程(ax+by=c). 1,化简方程,然后求解 ax+by = gcd(a,b); 2,求解 ax+by = c; 3,求出最小非负整数解x1三,步骤:  1,设青蛙跳了s步. 则有方程 (x + m*s) - (y + n*s) = l*k  -->…
A/B Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2017    Accepted Submission(s): 1469 Problem Description 要求(A/B)%9973,但因为A非常大,我们仅仅给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1).   Input 数据的第一…
今天终于弄懂了扩展欧几里德算法,有了自己的理解,觉得很神奇,就想着写一篇博客. 在介绍扩展欧几里德算法之前,我们先来回顾一下欧几里德算法. 欧几里德算法(辗转相除法): 辗转相除法求最大公约数,高中就学了,但当时知其然不知其所以然,直到大学才真正理解它的精髓. 理解辗转相除,关键在于理解 gcd(a,b)==gcd(b,a%b) 那么怎么去理解呢?下面是我的理解: 首先对于非负整数a,b,一定可以写成 a=k*b+r(r<b) 的形式 令 g=gcd(a,b) ,则有 g|a ,即 g|(k*b…
题意:两只青蛙在同一个纬度上跳跃,给定每个青蛙的开始坐标和每秒跳几个单位,纬度长为L,求它们相遇的最短时间. 析:开始,一看只有一组数据,就想模拟一下,觉得应该不会超时,但是不幸的是TLE了,我知道这肯定是一个数学题,不过刚开始没想到是扩展欧几里德,后来才发现这个可以转化为这个算法. 我们假设刚开始它们的坐标分别是x,y,它们的速度分别是m,n,坐标轴长为L,那么经过t次跳跃后它们的距离之差就是L(想一想是不是,可以画图看看). 所以(mt-x) - (nt-y) = kL;可转化为kL + (…
扩展欧几里得算法模板 #include <cstdio> #include <cstring> #define ll long long using namespace std; ll extend_gcd(ll a, ll b, ll &x, ll &y) { ) { x = , y = ; return a; } else { ll r = extend_gcd(b, a%b, y, x); y -= x*(a/b); return r; } } 1.对于形如a…
题目大意: 给定k,找到一个满足的a使任意的x都满足 f(x)=5*x^13+13*x^5+k*a*x 被65整除 推证: f(x) = (5*x^12 + 13 * x^4 + ak) * x 因为x可以任意取 那么不能总是满足 65|x 那么必须是 65 | (5*x^12 + 13 * x^4 + ak) 那么就是说 x^12 / 13 + x^4 / 5 + ak / 65 正好是一个整数 假设能找到满足的a , 那么将 ak / 65 分进x^12 / 13 + x^4 / 5中得到…
2057. [ZLXOI2015]殉国 ★☆   输入文件:BlackHawk.in   输出文件:BlackHawk.out   评测插件时间限制:0.05 s   内存限制:256 MB [题目描述] 正义的萌军瞄准了位于南极洲的心灵控制器,为此我们打算用空袭摧毁心灵控制器,然而心灵控制器是如此强大,甚至能缓慢控制飞行员.一群勇敢的士(feng)兵(zi)决定投弹后自杀来避免心灵控制.然而自杀非常痛苦,所以萌军指挥官决定到达目的地后让飞机没油而坠落(也避免逃兵).军官提供两种油:石油和中国输…
#include <iostream> using namespace std; int x, y; void get_x_y(int a, int b){ int q, r[3], s[3], t[3]; if(a < b) a ^= b ^= a ^= b; r[0] = a; r[1] = b; s[0] = 1; s[1] = 0; t[0] = 0; t[1] = 1; while(r[1] > 0){ q = r[0] / r[1]; r[2] = r[0] - q *…
青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 102239   Accepted: 19781 Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总…
数论题..所有数论对我来说都很恶心..不想再说什么了.. ------------------------------------------------ #include<iostream>   using namespace std;   void gcd(int a,int b,int &x,int &y) { if(!b) { x=1; y=0; } else { gcd(b,a%b,x,y); int t=x; x=y; y=t-a/b*x; } }   int ma…
Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的.但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的.为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面. 我们把这…
模板题 注意exgcd函数要稍微记一下 #include<cstdio> #include<cctype> #include<algorithm> #define REP(i, a, b) for(int i = (a); i < (b); i++) #define _for(i, a, b) for(int i = (a); i <= (b); i++) using namespace std; void read(int& x) { int f…
//#pragma comment(linker, "/STACK:1024000000,1024000000") //#pragma GCC optimize(2) #include <algorithm> #include <iostream> #include<sstream> #include<iterator> #include<cstring> #include<string> #include<…
有关欧几里德算法整理: 1.一些相关概念: <1>.整除性与约数: ①一个整数可以被另外一个整数整除即为d|a(表示d整除a,通俗的说是a可以被d整除),其含义也可以说成,存在某个整数k,使得a=kd. ②如果d|a且d>=0,则称d是a的约数. ③如果d|a,则-d|a,即a的任何约数的负数同样可以整除a.但一般规定,约数为非负数.非零整数a的约数应至少为1,且d<=|a|. ④因子:整数a的非平凡约数(除了1和它本身的约数)称为a的因子. <2>.素数和合数. &l…
扩展欧几里得求逆元 实话说这个算法如果手推的话问题不大,无非就是辗转相除法的逆过程,还有一种就是利用扩展欧几里德算法,学信安数学基础的时候问题不大,但现在几乎都忘了,刷题的时候也是用kuangbin博主全国通用的模板,代码十分简洁,但并没有理解其原理,学的时候也只了解了个大概. 来看代码吧: #include<bits/stdc++.h> using namespace std; int E_GCD(int a,int b,int &x,int &y) { if(!a&…
给出N个固定集合{1,N},{2,N-1},{3,N-2},...,{N-1,2},{N,1}.求出有多少个集合满足:第一个元素是A的倍数且第二个元素是B的倍数. 提示: 对于第二组测试数据,集合分别是:{1,10},{2,9},{3,8},{4,7},{5,6},{6,5},{7,4},{8,3},{9,2},{10,1}.满足条件的是第2个和第8个. Input 第1行:1个整数T(1<=T<=50000),表示有多少组测试数据. 第2 - T+1行:每行三个整数N,A,B(1<=N…
http://acm.hdu.edu.cn/showproblem.php?pid=1576 A/B Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3351 Accepted Submission(s): 2545 Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必…
这个题解得改一下,开始接触数论,这道题目一开始是看了别人的思路做的,后来我又继续以这种方法去做题,发现很困难,学长告诉我先看书,把各种词的定义看懂了,再好好学习,我做了几道朴素的欧几里德,尽管是小学生一样的题目我还是坚持做了几道,然后 看了中国余数定理 跟 中国剩余定理 还有扩展欧几里德的定义以及介绍,这次 这个题目是我自己思考出来的,这个题解是写给自己看的  同时向大家共享,学长说 做数论 要不时的回头 看看以前的题目 做做过了的题目,所以留个纪念 这道题目关节解决句是: 可以这样思考: 对于…
这个困扰了自己好久,终于找到了解释,还有自己改动了一点点,耐心看完一定能加深理解   扩展欧几里德算法-求解不定方程,线性同余方程. 设过s步后两青蛙相遇,则必满足以下等式: (x+m*s)-(y+n*s)=k*l(k=0,1,2....) 稍微变一下形得: (n-m)*s+k*l=x-y 令n-m=a,k=b,x-y=c,即 a*s+b*l=c 只要上式存在整数解,则两青蛙能相遇,否则不能. 首先想到的一个方法是用两次for循环来枚举s,l的值,看是否存在s,l的整数解,若存在则输入最小的s,…
/* 该题使用的是扩展欧几里德算法,求模线性同余方程: 分析题目:以题目输出结果为例 ,要求得到一个整数X可以满足 X % a = r,a,r,为数组名: 设数组元素为两个时, 列出方程:X % a1 = r1; X % a2 = r2; 可得出: a1*k1 + r1 = X; a2*k2 + r2 = X; 合并方程:a1*k1 + r1 = a2*k2 + r2,经变形得 a1*k1 - a2*k2 = r2 - r1; 由扩展欧几里德算法公式:ax + by = c; 得到 k1, 再将…
为什么老是碰上 扩展欧几里德算法 ( •̀∀•́ )最讨厌数论了 看来是时候学一学了 度娘百科说: 首先, ax+by = gcd(a, b) 这个公式肯定有解 (( •̀∀•́ )她说根据数论中的相关定理可以证明,反正我信了) 所以 ax+by = gcd(a, b) * k 也肯定有解 (废话,把x和y乘k倍就好了) 所以,这个公式我们写作ax+by = d,(gcd(a, b) | d) gcd(a, b) | d,表示d能整除gcd,这个符号在数学上经常见 那么已知 a,b 求 一组解…
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=106   题意:求ax + by + c = 0在[x1, x2], [y1, y2]区间内有多少组解? 解析: ①令c = -c有ax + by = c,可用扩展欧几里德解方程解出特解 当然要先考虑a = 0, b = 0, c = 0的情况进行特判 例如:a = 0, b = 1, c = 3,x∈[x1, x2], y∈[3, 4] 即可得知有方程有x2-x1+1个解,因为x可以区间…
https://www.hackerrank.com/contests/infinitum16-firsttimer/challenges/solve-equations 给定一条方程a*x + b*y = c 保证有解的情况下,我们要求一个点,满足x > 0且 这个点到原点的欧几里德距离最短 根据扩展欧几里德算法,我们能求得一组(x1,y1)满足x1 > 0的解,第一个x>0的解. 然后通解就是x2 = x1 + b/abgcd*k  y2 = y1 - a/abgcd*k 如果(x2…
                                                           青蛙的约会 以前不止一次看过这个题,但都没有去补..好吧,现在慢慢来做. 友情提示:先学扩展欧几里德算法在来看效果更好哟! 题意:两只青蛙在一个总长为L的环上,初始位置分别在x,y点,他们同时同向起跳,起跳都是同步的,速度分别是m,n.求跳多少次后才会相遇. 思路:会欧几里德算法的话简单分析一下就是裸模板了.但这题确实花了很多时间. 我们来分析一下这题:我们知道最终位置是在同一点…
本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia 题目大意 求解一组同余方程 x ≡ r1 (mod a1) x ≡ r2 (mod a2) x ≡ r3 (mod a3) ...... x ≡ rk (mod ak) 的解x(a1,a2,a3,.....ak 并不一定互质).如果不存在则输出-1. 输入格式 有多组数据,每组数组第一行为k,后面有k行,每行两个数,代表ai,ri. 输出格式 每一行对应每一个询问的解x. 样例输入 2 8 7 11…