扩展欧几里得原理与模板
POJ http://poj.org/problem?id=1061
什么是乘法逆元?
如果a与x的积除以z所得的余数为1,即 ax%z = 1 或 ax = 1(modz) ,则称a和x对于模数z来说互为逆元
记做: a^(-1) = x(mod z) 或 x^(-1) = a(mod z) 或 x ≡ 1/a(mod m) [其中1/a按指数法就写为a^(-1)].
其中如果a与z互质,则存在逆元,否则不存在
扩展欧几里德:
将公式 ax%y =1转化为 ax+by = 1;
很显然,当a和b不互质时,上式不可能成立,但一定满足贝祖等式 ax+by = gcd(a,b) = d
扩展欧几里德意义:
用来在已知a,b求解一组x,y, 使等式 ax+by = gcd(a, b) = d 成立(解一定存在)
方法:
已知 a*x1+b*y1 = gcd(a,b)
b*x2+(a%b)*y2 = gcd(b,a%b)
可得→ a*x1+b*y1 = b*x2+(a%b)*y2
→a*x1+b*y1 = b*x2+(a-a/b*b)*y2
→a*x1+b*y1 = b*x2+a*y2-a/b*b*y2
→x1 = y2 y1 = x2-a/b*y2;
当b = 0时, 显然gcd(a,b) = a。此时 x = 1,y = 0
所以只要将x和y通过上述转换递推回去即可,然后将最后得出的x1通过代入公式x = (x1%(b/gcd(a,b))+
b/gcd(a,b))%b/gcd(a,b)即可得出x
解题思路:
数据: 设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y.青蛙A一次能跳m米,青蛙B一次能跳n米.两只青蛙跳一次所
花费的时间相同.纬度线总长L米(形成环),则可得相遇充要公式: (x+m*t)-(y+n*t) = L*q; (t为跳的次数,q为跳的圈数)
将公式转化得 (n-m)*t+q*L = x-y,很显然,当x-y是gcd(n-m, L)的倍数时, 两青蛙才能相遇,此时答案便是
t*[(x-y)/gcd(n-m, L)],但x-y可能为负数,所以需要(答案%(L/gcd(n-m, L))+L/gcd(n-m, L))%(L/gcd(n-m, L))%L;
#include<stdio.h>
#define Swap(a, b) temp = a, a = b, b = temp
long long x1, y1;
long long PowerGcd(long long a, long long b);
int main(void)
{long long x, y, n, m, p, d, temp;while(scanf("%lld%lld%lld%lld%lld", &x, &y, &m, &n, &p)!=EOF){if(n<m){Swap(n, m);Swap(x, y);}d = PowerGcd(n-m, p);if((x-y)%d!=0)printf("Impossible\n");elseprintf("%lld\n", ((x1*(x-y)/d)%(p/d)+p/d)%(p/d));}return 0;
}long long PowerGcd(long long a, long long b) /*扩展欧几里德*/
{long long t, temp;if(b==0){x1 = 1;y1 = 0;return a;}t = PowerGcd(b, a%b);temp = x1;x1 = y1;y1 = temp-a/b*y1;return t;
}
扩展欧几里得原理与模板相关推荐
- 欧几里得原理及扩展欧几里得原理(Euclidean Theory and Extended Euclidean Theory)学习笔记
题记:这是我第四次复习扩展欧几里得原理,因为不常用到,想要使用的时候又想不起细节,总是要查资料,于是索性这次整理一下欧几里得原理及其扩展原理存档至博客以备查用. 一.欧几里得原理 欧几里得原理(Euc ...
- Strange Optimization(扩展欧几里得)
Strange Optimization Accepted : 67 Submit : 289 Time Limit : 1000 MS Memory Limit : 65536 KB Str ...
- Romantic(扩展欧几里得模板)
裴蜀定理: 任意整数 a, b,(a, b)|d ⇐⇒ ∃ 整数 x, y 使得 ax + by = d,即ax+by=d,那么d一定是gcd(a,b)的倍数 扩展欧几里得定理: 对于两个不全为0的整 ...
- [模板]欧几里得算法/扩展欧几里得
最大公因数(欧几里得算法) $gcd(a,b)=gcd(b\%a,a)$(不一定需要a<b) $gcd(0,b)=b$ 1 inline int gcd(int a,int b){ 2 retu ...
- 求逆元(线性求逆元)及其扩展欧几里得
线性求逆元模板: int inv[maxn]; void initInverse(){inv[1] = 1;for(int i = 2; i <= maxn; i++)inv[i] = (p - ...
- POJ - 1061 青蛙的约会(扩展欧几里得)
题目链接:点击查看 题目大意:两只青蛙在一个单向循环数轴上跳动,给出初始位置和每秒跳动的距离以及数轴长度,问是否可以相遇,若能相遇求出最小时间 题目分析:自从第一次接触扩展欧几里得以来已经有半年时间了 ...
- 数论一之定理证明——裴蜀/威尔逊/费马/扩展欧几里得/[扩展]欧拉/[扩展]中国剩余定理,欧拉函数,逆元,剩余系,筛法
打死没想到会在H老师处学懂数论 同余,整除 模运算 埃式筛法 欧拉筛法 最大公约数和最小公倍数 辗转相除法 更相减损术 裴蜀定理 威尔逊定理 费马定理 同余等价类.剩余系.缩系 欧拉函数 欧拉定理 扩 ...
- POJ 1061扩展欧几里得
扩展欧几里得的模板题,需要注意的是为了得到一个最小正数解我们要使ax+by=c中的a,b都是正数 #include<cstdio> #include<cstring> #inc ...
- Codeforces7C 扩展欧几里得
Line Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Submit Status ...
最新文章
- postgresql 远程用户_liunx环境下安装PostgresSQL,开启远程连接
- leetcode算法题--反转链表 II★
- Sql2008R2 日志无法收缩解决方案
- 思考:那么些大学生仅凭个人好恶来判断,缺乏是非观
- 本地win10服务器不能复制文件,手把手为你解说win10系统所有文件都不能复制的步骤...
- leetcode185 Department Top Three Salaries
- 央行发布声纹识别安全应用技术标准,适用手机银行、第三方支付
- 常微分方程:初值问题与边值问题
- 解决jQuery中dbclick事件触发两次click事件
- AxInterop.ShockwaveFlashObjects.dll 问题
- 114-select(基础)
- 手机淘宝自动加好友及聊天实现
- 教学教法改革效果评估的4种方法
- 计算机没有游戏客户端程序咋办,电脑开始菜单游戏不见了怎么办
- Redis-desktop-manager显示黑屏
- 用OpenStack搭建简单的云平台并启动云主机
- 1.2经济金融基础之金融基础知识
- Oracle Database 数据库
- FusionCharts简单教程(一)---建立第一个FusionCharts图形
- Solaris10如何确认DirectIO是否已经启用
热门文章
- python画3d图-python3利用Axes3D库画3D模型图
- python中文视频教程-中谷python中文视频教程(全38集)
- python爬虫怎么挣钱-个人利用Python爬虫技术怎么挣钱
- 自学python考哪些证书-给零基础学习Python的小伙伴的四个建议
- jQuery-元素节点操作
- VUE图片裁剪功能vue-img-cutter
- VUE颜色选择器插件vColorPicker
- 【堆】Leetcode692:前k个高频单词
- 题目 1885: 2017 分巧克力
- jQuery的get()、map()、map().get().join()简单应用